2013-01-31 38 views
6

我搜索了很多,并且我发现这个问题最接近这个(也没有答案):node-gyp on OSX 10.7.5 - dyld:懒惰符号绑定失败:找不到符号

Symbol not found: _libintl_gettext

我试图做出libpuzzle薄的C++封装。

$ node --version 
v0.8.18 
$ npm --version 
1.2.4 
$ node-gyp --version 
v0.8.3 

Source code on github

极力打造(我的手短接...路径)

$ node-gyp clean configure build && node test.js 
gyp info it worked if it ends with ok 
gyp info using [email protected] 
gyp info using [email protected] | darwin | x64 
gyp info spawn python 
gyp info spawn args [ '/opt/local/lib/node_modules/node-gyp/gyp/gyp', 
gyp info spawn args 'binding.gyp', 
gyp info spawn args '-f', 
gyp info spawn args 'make', 
gyp info spawn args '-I', 
gyp info spawn args '/.../node-puzzle/build/config.gypi', 
gyp info spawn args '-I', 
gyp info spawn args '/opt/local/lib/node_modules/node-gyp/addon.gypi', 
gyp info spawn args '-I', 
gyp info spawn args '/.../.node-gyp/0.8.18/common.gypi', 
gyp info spawn args '-Dlibrary=shared_library', 
gyp info spawn args '-Dvisibility=default', 
gyp info spawn args '-Dnode_root_dir=/.../.node-gyp/0.8.18', 
gyp info spawn args '-Dmodule_root_dir=/.../node-puzzle', 
gyp info spawn args '--depth=.', 
gyp info spawn args '--generator-output', 
gyp info spawn args 'build', 
gyp info spawn args '-Goutput_dir=.' ] 
gyp info spawn make 
    CXX(target) Release/obj.target/puzzle/puzzle.o 
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] 
    SOLINK_MODULE(target) Release/puzzle.node 
    SOLINK_MODULE(target) Release/puzzle.node: Finished 
gyp info ok 
dyld: lazy symbol binding failed: Symbol not found: __Z19puzzle_init_contextP14PuzzleContext_ 
    Referenced from: /.../node-puzzle/build/Release/puzzle.node 
    Expected in: dynamic lookup 

dyld: Symbol not found: __Z19puzzle_init_contextP14PuzzleContext_ 
    Referenced from: /.../node-puzzle/build/Release/puzzle.node 
    Expected in: dynamic lookup 

好了,这个错误对我来说很有意义,显然它不能加载一个动态库。

起初我以为我不得不调整我的binding.gyp以包括链接器设置,所以我尝试了几种不同的配置。目前,这是它的样子:

{ 
    "targets": [ 
     { 
      "target_name": "puzzle", 
      "sources": [ "puzzle.cc" ], 
      "link_settings": { 
       "libraries": [ 
        "/opt/local/lib/libgd.dylib", 
        "/opt/local/lib/libpuzzle.dylib" 
       ], 
      } 
     } 
    ] 
} 

我这里有库:

$ ll /opt/local/lib/libpuzzle.* 
-rwxr-xr-x 1 root admin 19K Jan 30 21:24 /opt/local/lib/libpuzzle.1.dylib 
-rw-r--r-- 1 root admin 20K Jan 30 21:24 /opt/local/lib/libpuzzle.a 
lrwxr-xr-x 1 root admin 17B Jan 30 21:24 /opt/local/lib/libpuzzle.dylib -> libpuzzle.1.dylib 
-rwxr-xr-x 1 root admin 1.3K Jan 30 21:24 /opt/local/lib/libpuzzle.la 

$ ll /opt/local/lib/libgd.* 
-rwxr-xr-x 1 root admin 252K Sep 2 23:59 /opt/local/lib/libgd.2.dylib 
-rw-r--r-- 1 root admin 289K Sep 2 23:59 /opt/local/lib/libgd.a 
lrwxr-xr-x 1 root admin 13B Sep 2 23:59 /opt/local/lib/libgd.dylib -> libgd.2.dylib 
-rwxr-xr-x 1 root admin 1.2K Sep 2 23:59 /opt/local/lib/libgd.la 

我只是无法弄清楚如何让dyld看到他们。我试图调整DYLD_FRAMEWORK_PATH和DYLD_FALLBACK_LIBRARY_PATH无济于事。

更新:输出从otool

otool -l build/Release/puzzle.node

build/Release/puzzle.node: 
Load command 0 
     cmd LC_SEGMENT_64 
    cmdsize 552 
    segname __TEXT 
    vmaddr 0x0000000000000000 
    vmsize 0x0000000000002000 
    fileoff 0 
filesize 8192 
    maxprot 0x00000007 
initprot 0x00000005 
    nsects 6 
    flags 0x0 
Section 
    sectname __text 
    segname __TEXT 
     addr 0x0000000000000edc 
     size 0x00000000000008d8 
    offset 3804 
    align 2^2 (4) 
    reloff 0 
    nreloc 0 
    flags 0x80000400 
reserved1 0 
reserved2 0 
Section 
    sectname __stubs 
    segname __TEXT 
     addr 0x00000000000017b4 
     size 0x000000000000010e 
    offset 6068 
    align 2^1 (2) 
    reloff 0 
    nreloc 0 
    flags 0x80000408 
reserved1 0 (index into indirect symbol table) 
reserved2 6 (size of stubs) 
Section 
    sectname __stub_helper 
    segname __TEXT 
     addr 0x00000000000018c4 
     size 0x000000000000021c 
    offset 6340 
    align 2^2 (4) 
    reloff 0 
    nreloc 0 
    flags 0x80000400 
reserved1 0 
reserved2 0 
Section 
    sectname __cstring 
    segname __TEXT 
     addr 0x0000000000001ae0 
     size 0x00000000000001ea 
    offset 6880 
    align 2^0 (1) 
    reloff 0 
    nreloc 0 
    flags 0x00000002 
reserved1 0 
reserved2 0 
Section 
    sectname __unwind_info 
    segname __TEXT 
     addr 0x0000000000001cca 
     size 0x000000000000008c 
    offset 7370 
    align 2^0 (1) 
    reloff 0 
    nreloc 0 
    flags 0x00000000 
reserved1 0 
reserved2 0 
Section 
    sectname __eh_frame 
    segname __TEXT 
     addr 0x0000000000001d58 
     size 0x00000000000002a8 
    offset 7512 
    align 2^3 (8) 
    reloff 0 
    nreloc 0 
    flags 0x00000000 
reserved1 0 
reserved2 0 
Load command 1 
     cmd LC_SEGMENT_64 
    cmdsize 472 
    segname __DATA 
    vmaddr 0x0000000000002000 
    vmsize 0x0000000000001000 
    fileoff 8192 
filesize 4096 
    maxprot 0x00000007 
initprot 0x00000003 
    nsects 5 
    flags 0x0 
Section 
    sectname __dyld 
    segname __DATA 
     addr 0x0000000000002000 
     size 0x0000000000000010 
    offset 8192 
    align 2^3 (8) 
    reloff 0 
    nreloc 0 
    flags 0x00000000 
reserved1 0 
reserved2 0 
Section 
    sectname __got 
    segname __DATA 
     addr 0x0000000000002010 
     size 0x0000000000000010 
    offset 8208 
    align 2^3 (8) 
    reloff 0 
    nreloc 0 
    flags 0x00000006 
reserved1 45 (index into indirect symbol table) 
reserved2 0 
Section 
    sectname __la_symbol_ptr 
    segname __DATA 
     addr 0x0000000000002020 
     size 0x0000000000000168 
    offset 8224 
    align 2^3 (8) 
    reloff 0 
    nreloc 0 
    flags 0x00000007 
reserved1 47 (index into indirect symbol table) 
reserved2 0 
Section 
    sectname __data 
    segname __DATA 
     addr 0x0000000000002190 
     size 0x0000000000000060 
    offset 8592 
    align 2^4 (16) 
    reloff 0 
    nreloc 0 
    flags 0x00000000 
reserved1 0 
reserved2 0 
Section 
    sectname __const 
    segname __DATA 
     addr 0x00000000000021f0 
     size 0x0000000000000030 
    offset 8688 
    align 2^4 (16) 
    reloff 0 
    nreloc 0 
    flags 0x00000000 
reserved1 0 
reserved2 0 
Load command 2 
     cmd LC_SEGMENT_64 
    cmdsize 72 
    segname __LINKEDIT 
    vmaddr 0x0000000000003000 
    vmsize 0x0000000000002000 
    fileoff 12288 
filesize 6648 
    maxprot 0x00000007 
initprot 0x00000001 
    nsects 0 
    flags 0x0 
Load command 3 
      cmd LC_ID_DYLIB 
     cmdsize 48 
     name @rpath/puzzle.node (offset 24) 
    time stamp 1 Wed Dec 31 19:00:01 1969 
     current version 0.0.0 
compatibility version 0.0.0 
Load command 4 
    cmd LC_SYMTAB 
cmdsize 24 
    symoff 12720 
    nsyms 138 
    stroff 15344 
strsize 3592 
Load command 5 
      cmd LC_DYSYMTAB 
     cmdsize 80 
     ilocalsym 0 
     nlocalsym 76 
    iextdefsym 76 
    nextdefsym 19 
     iundefsym 95 
     nundefsym 43 
     tocoff 0 
      ntoc 0 
     modtaboff 0 
     nmodtab 0 
    extrefsymoff 0 
    nextrefsyms 0 
indirectsymoff 14976 
    nindirectsyms 92 
     extreloff 14928 
     nextrel 6 
     locreloff 12288 
     nlocrel 50 
Load command 6 
    cmd LC_UUID 
cmdsize 24 
    uuid 9A75E329-2D02-3AC8-A249-A741702EB141 
Load command 7 
     cmd LC_VERSION_MIN_MACOSX 
    cmdsize 16 
    version 10.5 
     sdk 10.7 
Load command 8 
      cmd LC_LOAD_DYLIB 
     cmdsize 64 
     name /opt/local/lib/libssl.1.0.0.dylib (offset 24) 
    time stamp 2 Wed Dec 31 19:00:02 1969 
     current version 1.0.0 
compatibility version 1.0.0 
Load command 9 
      cmd LC_LOAD_DYLIB 
     cmdsize 64 
     name /opt/local/lib/libcrypto.1.0.0.dylib (offset 24) 
    time stamp 2 Wed Dec 31 19:00:02 1969 
     current version 1.0.0 
compatibility version 1.0.0 
Load command 10 
      cmd LC_LOAD_DYLIB 
     cmdsize 56 
     name /opt/local/lib/libgd.2.dylib (offset 24) 
    time stamp 2 Wed Dec 31 19:00:02 1969 
     current version 3.0.0 
compatibility version 3.0.0 
Load command 11 
      cmd LC_LOAD_DYLIB 
     cmdsize 64 
     name /opt/local/lib/libpuzzle.1.dylib (offset 24) 
    time stamp 2 Wed Dec 31 19:00:02 1969 
     current version 2.0.0 
compatibility version 2.0.0 
Load command 12 
      cmd LC_LOAD_DYLIB 
     cmdsize 56 
     name /usr/lib/libstdc++.6.dylib (offset 24) 
    time stamp 2 Wed Dec 31 19:00:02 1969 
     current version 52.0.0 
compatibility version 7.0.0 
Load command 13 
      cmd LC_LOAD_DYLIB 
     cmdsize 56 
     name /usr/lib/libSystem.B.dylib (offset 24) 
    time stamp 2 Wed Dec 31 19:00:02 1969 
     current version 159.1.0 
compatibility version 1.0.0 
Load command 14 
      cmd LC_LOAD_DYLIB 
     cmdsize 56 
     name /usr/lib/libgcc_s.1.dylib (offset 24) 
    time stamp 2 Wed Dec 31 19:00:02 1969 
     current version 1094.0.0 
compatibility version 1.0.0 
Load command 15 
     cmd LC_FUNCTION_STARTS 
    cmdsize 16 
    dataoff 12688 
datasize 32 
Load command 16 
     cmd LC_DATA_IN_CODE 
    cmdsize 16 
    dataoff 12720 
datasize 0 

otool -L build/Release/puzzle.node

build/Release/puzzle.node: 
    @rpath/puzzle.node (compatibility version 0.0.0, current version 0.0.0) 
    /opt/local/lib/libssl.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) 
    /opt/local/lib/libcrypto.1.0.0.dylib (compatibility version 1.0.0, current version 1.0.0) 
    /opt/local/lib/libgd.2.dylib (compatibility version 3.0.0, current version 3.0.0) 
    /opt/local/lib/libpuzzle.1.dylib (compatibility version 2.0.0, current version 2.0.0) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 52.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1094.0.0) 

回答

7

该dyld的抱怨的符号是__Z19puzzle_init_contextP14PuzzleContext_。在它的无形式,它是puzzle_init_context(PuzzleContext_*)。 mangling表示它被编译器视为一个C++符号。但是,libpuzzle似乎会导出纯粹的C接口。这意味着它应该正在寻找的符号是_puzzle_init_context。您可以通过将#include <puzzle.h>包装在extern "C" { … }块中来解决此问题,以通知编译器头文件的内容应被视为C代码,因此它将通过适当的规则处理符号名称。

这种错误通常由静态链接程序检测,而不是由动态链接程序在运行时检测到。错误消息的Expected in: dynamic lookup部分表示puzzle.node已与-undefined dynamic_lookup连接。这告诉静态链接器不要为未定义的符号发出任何错误,而是让动态链接器尝试在运行时解析符号。这很少是你想要的行为。

+0

所以这是你的建议我静态链接在libpuzzle和libgd,而不是让他们动态链接?我原来的想法是,让它们动态链接到系统中会更好。 – slf

+0

不会。动态链接与静态链接的问题与您现在看到的问题是正相关的。使用'-undefined dynamic_lookup'不能控制你是否使用动态链接,而只是链接器行为的一个特定方面。没有该标志的正常行为是由链接器确定哪个dylib包含被链接的代码使用的每个符号。如果找不到任何符号,则会出现错误。 '-undefined dynamic_lookup'可以抑制这些错误,并希望在运行时加载一个库,该库提供了有问题的符号。 – bdash

+0

@bdash可以通过将#include 包装在extern“C”{...}块中来更详细地解释这个'''。我遇到了同样的问题,我使用的库也在C中。 –

相关问题