GYP动态库未与依赖动态库

时间:2016-07-04 20:21:12

标签: ubuntu shared-libraries dlopen gyp

我有一个程序可以使用另一个.so libary

来创建一个.so库
  • 我的程序(在运行时使用dlopen的libctp.so)
  • libctp.so(我做的)
  • thostmduserapi.so(由其他人制作,libctp.so使用它)

但是当它运行时,它会显示以下错误:

symbol lookup error: ./libctp.so: undefined symbol: _ZN15CThostFtdcMdApi15CreateFtdcMdApiEPKcbb

然后我发现我的.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;
}

1 个答案:

答案 0 :(得分:0)

尝试设置librarieslibrary_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',
        ],
    },
],