node-gyp OSX 10.7.5 – dyld:懒惰符号绑定失败:找不到符号

我search了很多,我发现这个问题最接近的是这个(也没有答案)的问题:

找不到符号:_libintl_gettext

我正在尝试为libpuzzle制作一个精简的c ++包装器。

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

github上的源代码

试图build立(我已经用…来缩短path)

 $ node-gyp clean configure build && node test.js gyp info it worked if it ends with ok gyp info using node-gyp@0.8.3 gyp info using node@0.8.18 | 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 

好的,所以这个错误对我来说很有意义,显然它不能加载dynamic库。

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

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

我有这里的libs:

 $ 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) 

dyld抱怨的符号是__Z19puzzle_init_contextP14PuzzleContext_ 。 在它的puzzle_init_context(PuzzleContext_*)forms,它是puzzle_init_context(PuzzleContext_*) 。 mangling表示编译器认为它是一个C ++符号。 但是,libpuzzle似乎会导出纯粹的C接口。 这意味着它应该查找的符号是_puzzle_init_context 。 你可以通过将#include <puzzle.h>封装在一个extern "C" { … }块中来解决这个问题,以通知编译器头部的内容应该被当作C代码来处理,所以它将通过适当的规则。

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