linux – 链接到静态库后的未定义引用
发布时间:2020-12-13 23:08:18 所属栏目:Linux 来源:网络整理
导读:我写了一个简单的程序来测试xdotool是否能满足我的要求. (嗯,不是真的.我的第一步是确保我是否可以调用xdotool库.) #include xdo.h#include iostreamusing namespace std;int main(){ cout xdo_version() endl; xdo_new(NULL); return 0;} 但是,当我使用g -o
我写了一个简单的程序来测试xdotool是否能满足我的要求. (嗯,不是真的.我的第一步是确保我是否可以调用xdotool库.)
#include <xdo.h> #include <iostream> using namespace std; int main(){ cout << xdo_version() << endl; xdo_new(NULL); return 0; } 但是,当我使用g -o a main.cpp libxdo.a -lXtst -lX11 -lXinerama -I ../test/xdotool-2.20110530.1编译它时,我收到以下错误消息: /tmp/ccW95RQx.o: In function `main': main.cpp:(.text+0x5): undefined reference to `xdo_version()' main.cpp:(.text+0x29): undefined reference to `xdo_new(char*)' collect2: error: ld returned 1 exit status make: *** [sendkey] Error 1 我没有使用apt-get install的开发包,因为它安装了一个动态库.所以,我做了一个apt-get源并自己构建了库.我通过执行以下命令验证了xdo_version和xdo_new是静态库中定义的函数: $nm libxdo.a | grep xdo_version 00000000000002b0 T xdo_version $nm libxdo.a | grep xdo_new 0000000000004070 T xdo_new 0000000000003c90 T xdo_new_with_opened_display 如果我没有弄错,除了符号名称之外的T意味着该函数已被定义. 总之,我试图让上面的C片段成功编译并静态链接到xdotool但是遇到了一些如上所述的错误. 解决方法
提示:如果链接器显示函数的签名,则它知道该函数的签名.这是什么意思?这意味着它在编译时以某种方式编码在函数名中,i.即你是C
name mangling的受害者.
当C代码编译为C时,似乎xdo.h头文件不包含安全措施.自己手动将函数声明为extern“C”,然后重新编译,它将起作用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |