OSX 10.7.5上的node-gyp - dyld:惰性符号绑定失败:找不到符号

时间:2013-01-31 16:06:58

标签: c++ macos node.js dyld node-gyp

我搜索了很多,而我在同一个问题上找到的最接近的是这个(也是没有答案的)问题:

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

好的,所以这个错误对我有意义,显然它无法加载动态库。

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

{
    "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)

1 个答案:

答案 0 :(得分:7)

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

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