我写了一个简单的程序来测试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,但遇到了一些错误,如上所述。
答案 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