【问题标题】:Dylib ok at link time but not at runtimeDylib 在链接时可以,但在运行时不行
【发布时间】:2012-06-27 11:36:35
【问题描述】:

我在正确链接我的项目时遇到问题。该项目是用 CMAKE 构建的。链接看起来不错,但在运行时会引发错误。

这是用于链接的命令:

$ /usr/bin/clang -Wl,-search_paths_first -Wl,-headerpad_max_install_names  \
      CMakeFiles/project.dir/src/conf.c.o CMakeFiles/project.dir/src/tun-compat.c.o \
      CMakeFiles/project.dir/src/compress.c.o CMakeFiles/project.dir/src/mc.c.o \
      CMakeFiles/project.dir/src/hexdump.c.o CMakeFiles/project.dir/src/server.c.o \
      CMakeFiles/project.dir/sys/unix/log.c.o CMakeFiles/project.dir/sys/unix/imsg.c.o \
      CMakeFiles/project.dir/ sys/unix/imsg-buffer.c.o CMakeFiles/project.dir/sys/unix/toto.c.o \
      CMakeFiles/project.dir/sys/unix/toto.c.o CMakeFiles/project.dir/sys/unix/util.c.o \
      CMakeFiles/project.dir/sys/unix/conf.c.o CMakeFiles/project.dir/sys/unix/tntsocket.c.o \
      -o bin/project/opt/local/lib/libevent_openssl.dylib /opt/local/lib/libevent_core.dylib \
      /usr/lib/libz.dylib /opt/local/lib/libyajl.dylib /opt/local/lib/libtapcfg.dylib  

我得到的错误:

$ ./bin/project                                                                                                                                                                                             
dyld: Library not loaded: build/libtapcfg.dylib                                                                                                                                                             
  Referenced from: /Users/Antoine/project/./bin/project                                                                                                                                                     
  Reason: image not found                                                                                                                                                                                   
zsh: trace trap  ./bin/project                                                                                                                                                                              

附加信息:

 $ dyldinfo -dylibs bin/projectattributes                                                                                                                                                            
         dependent dylibs                                                                                                                                                                                        
                        /opt/local/lib/libevent_openssl-2.0.5.dylib                                                                                                                                         
                        /opt/local/lib/libevent_core-2.0.5.dylib                                                                                                                                                                    
                        /usr/lib/libz.1.dylib                                                                                                                                                               
                        /opt/local/lib/libyajl.2.dylib                                                                                                                                                      
                        build/libtapcfg.dylib                                                                                                                                                               
                        /usr/lib/libSystem.B.dylib                                                                                                                                                          

在我看来,这就像黑魔法。链接器能够找到符号,但最终会更改库的路径,即使我看不到在链接命令中处理它的方式有任何区别......

lib位置是/opt/local/lib/libtapcfg.dylib

$ ls -lhF /opt/local/lib/libtapcfg.dylib                                                                                                                                                                    
-rwxr-xr-x  1 root  admin    20K 14 jui 18:05 /opt/local/lib/libtapcfg.dylib*                                                                                                                               

问题可能来自我要链接的库吗?

【问题讨论】:

  • libtapcfg 是从哪里来的? (即哪个端口)
  • 不是端口,只是我手动安装的免费项目。 (code.google.com/p/tapcfg)

标签: macos dylib


【解决方案1】:

问题在于您如何构建和安装 libtapcfg。

您似乎已将其从本地目录复制到 /opt/local/lib,因此其文件系统路径与库中存储的路径不匹配。

要么将 lib 保留在本地路径中,要么在构建它时告诉链接器它将在哪里结束或复制到链接器中硬编码的 /usr/local/lib。见Apple developer's note on dynamic libraries

当通过端口使用 macports 时,您应该只将东西放在 /opt/local 中。在这种情况下,创建一个不需要做太多事情的本地端口文件,macports 标准工作会将正确的信息放入库中以使其从 /opt/local/lib 工作

【讨论】:

  • 谢谢!将 dylib 移动到 /usr/local/lib 是最好的解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-12-24
  • 2021-12-11
  • 2023-01-18
  • 1970-01-01
  • 2016-08-18
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多