【发布时间】:2016-07-04 20:21:12
【问题描述】:
我有一个程序可以打开一个我制作的 .so 库,该库使用另一个 .so 库
- 我的程序(在运行时通过 dlopen 使用 libctp.so)
- libctp.so(我做的)
- thostmduserapi.so(别人做的,libctp.so用的)
但是当它运行时,它会显示这个错误:
symbol lookup error: ./libctp.so: undefined symbol: _ZN15CThostFtdcMdApi15CreateFtdcMdApiEPKcbb
然后我发现我的 .so 实际上并没有与另一个 .so 链接 我用 ldd 来检查它:
$ldd libctp.so
linux-vdso.so.1 => (0x00007fff2b7db000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f736b082000)
/lib64/ld-linux-x86-64.so.2 (0x00007f736b649000)
那里没有 thostmduserapi.so!它不会对我产生影响,所以我尝试不使用 GYP 来生成 makefile。相反,我手动输入命令来编译它,如下所示:
$ g++ -fPIC -shared main.cpp -l:thostmduserapi.so -Wl,-rpath,. -o libctp.so
有效!
$ ldd libctp.so
linux-vdso.so.1 => (0x00007ffc0f6cb000)
thostmduserapi.so (0x00007fb3cde36000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb3cda71000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb3cd853000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb3cd64b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb3cd447000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb3cd143000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb3cce3d000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb3ccc27000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb3ce5dd000)
thostmduserapi.so 在那里!!
但是为什么 GYP 生成的 makefile 没有与 thostmduserapi.so 链接!?? 这对我来说似乎很奇怪。有谁知道 GYP 的项目发生了什么?
提前感谢您的帮助!
这是我的 GYP 文件:
{
'targets': [
{
'target_name': 'ctp',
'type': 'shared_library',
'include_dirs': [
'../../../',
],
'sources': [
'main.cpp',
],
'product_dir': '../../../deploy',
'ldflags': [
'-l:thostmduserapi.so',
'-L../../../third_party/ctp/linux64',
'-Wl,-rpath,.',
],
'cflags': [
'-fPIC',
'-std=c++11',
],
},
],
}
这是我的 .so 库的代码
#include <third_party/ctp/linux64/include/ThostFtdcMdApi.h>
#include <stdio.h>
void* get_exchange_api(){
printf("test\n");
CThostFtdcMdApi::CreateFtdcMdApi(); // <-- function in thostmduserapi.so
return 0;
}
【问题讨论】:
-
我发现问题是由 GYP 生成的命令的顺序引起的
-
g++ -fPIC -shared -l:thostmduserapi.so -L../../../third_party/ctp/linux64 -Wl,-rpath,. -o libctp2.so main2.o
-
如果我把main2.o放在-l:thostmduserapi.so之前,一切都很好,但是如何控制GYP的命令顺序呢?
-
我最终修改了 GYP 的代码。修改/build/gyp/pylib/gyp/generator/make.py,让LDFLAGS在$(LIBS)之后,解决了我的问题!
标签: ubuntu shared-libraries dlopen gyp