草庐IT

c++ - OSX 10.7.5 上的 node-gyp -- dyld : lazy symbol binding failed: Symbol not found

coder 2024-02-03 原文

我搜索了很多,我发现最接近同一个问题的是这个(也是未回答的)问题:

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"
                ],
            }
        }
    ]
}

我这里有库:

$ 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_*) .改编表明编译器认为它是 C++ 符号。但是,libpuzzle 似乎导出纯 C 接口(interface)。这意味着它应该寻找的符号是_puzzle_init_context。 .您可以通过包装 #include <puzzle.h> 来解决此问题在extern "C" { … } block 通知编译器 header 的内容应被视为 C 代码,因此它将按照适当的规则处理符号名称。

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

关于c++ - OSX 10.7.5 上的 node-gyp -- dyld : lazy symbol binding failed: Symbol not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14630044/

有关c++ - OSX 10.7.5 上的 node-gyp -- dyld : lazy symbol binding failed: Symbol not found的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  3. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  4. ruby - rbenv 安装 ruby​​ 校验和不匹配 osx - 2

    我已经在mountainlion上成功安装了rbenv和ruby​​build。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub

  5. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  6. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

  9. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  10. ruby-on-rails - gem install rmagick -v 2.13.1 错误 Failed to build gem native extension on Mac OS 10.9.1 - 2

    我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/

随机推荐