【问题标题】:GYP dynamic library not linking with dependent dynamic libraryGYP 动态库未与依赖动态库链接
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我修改了 GYP 的代码来解决这个问题,我认为这是一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 2019-10-02
  • 1970-01-01
相关资源
最近更新 更多