2016-07-04 10 views
0

У меня есть программа, которая 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; 
} 
+0

Я обнаружил, что проблема вызвана порядком команд, сгенерированных GYP – kchkg

+0

g ++ -fPIC -shared -l: thostmduserapi.so -L ../../../ third_party/ctp/linux64 -Wl, -rpath ,. -o libctp2.so main2.o – kchkg

+0

, если я помещаю main2.o перед -l: thostmduserapi.so, все в порядке, но как контролировать командный порядок GYP? – kchkg

ответ

0

Try установить libraries и library_dirs вместо ldflags манипуляции:

{ 
'targets': [ 
    { 
     'target_name': 'ctp', 
     'type': 'shared_library', 
     'include_dirs': [ 
      '../../../', 
     ], 
     'sources': [ 
      'main.cpp', 
     ], 
     'product_dir': '../../../deploy', 
     'library_dirs': ['../../../third_party/ctp/linux64'], 
     'libraries': ['thostmduserapi'], 
     'cflags': [ 
      '-fPIC', 
      '-std=c++11', 
     ], 
    }, 
], 
+0

нет, это не работает – kchkg

+0

Я изменил код GYP, чтобы решить эту проблему, и я думаю, что это ошибка. – kchkg

 Смежные вопросы

  • Нет связанных вопросов^_^