У меня есть программа, которая dlopen в .so библиотеки, я сделал, что использует другой .so libaryGYP динамическая библиотека не связывая с зависимой динамической библиотеки
- мою программу (которая использует libctp.so по dlopen во время выполнения)
- 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 для создания make-файла. Вместо этого я печатаю команду вручную для ее компиляции, как показано ниже:
$ 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 есть !!
Но как получилось, что makefile, созданный GYP, не связан с 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 – kchkg
g ++ -fPIC -shared -l: thostmduserapi.so -L ../../../ third_party/ctp/linux64 -Wl, -rpath ,. -o libctp2.so main2.o – kchkg
, если я помещаю main2.o перед -l: thostmduserapi.so, все в порядке, но как контролировать командный порядок GYP? – kchkg