链接静态库后的未定义引用

swt*_*rgn 4 linux linker g++ static-libraries xdotool

我写了一个简单的程序来测试xdotool是否能满足我的要求.(嗯,不是真的.我的第一步是确保我是否可以调用xdotool库.)

#include <xdo.h>
#include <iostream>

using namespace std;

int main(){
    cout << xdo_version() << endl;
    xdo_new(NULL);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我编译它时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
Run Code Online (Sandbox Code Playgroud)

我没有使用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
Run Code Online (Sandbox Code Playgroud)

如果我没有弄错,T除了符号的名称意味着定义了函数.

总之,我试图让上面的C++片段成功编译并静态链接到xdotool,但遇到了一些错误,如上所述.

小智 5

提示:如果链接器显示函数的签名,则它知道该函数的签名.这是什么意思?这意味着它在编译时以某种方式在函数名中编码,即您是C++ 名称修改的受害者.

xdo.h当C代码编译为C++时,似乎标题不包含安全措施.extern "C"为自己手动声明函数,然后重新编译,它将工作.