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

时间:2013-05-22 16:06:03

标签: 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;
}

但是,当我用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,但遇到了一些错误,如上所述。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:0)

以下是在g ++上使用动态库的一些指导,从编码到运行。

应用程序代码 main.cpp

#include <iostream>

using namespace std;

extern "C" int funct(const int in);

int main(int argc, char** args){

    cout << "test message " << funct(5) << endl;
    return 0;
}

功能代码 libtest.cpp

#include <iostream>

using namespace std;

extern "C" int funct(const int in){
    return in*in;
}

构建.so文件 libtest.so

g++ -fPIC -c libtest.cpp
g++ -shared -o libtest.so libtest.o

构建应用 主要

g++ -L. main.cpp -o main -ltest

正在运行的应用 设置环境变量

@bash:    export LD_LIBRARY_PATH =:$ LD_LIBRARY_PATH

@tcsh:    setenv LD_LIBRARY_PATH:$ LD_LIBRARY_PATH

跑吧!!!

./main
test message 25