0

我在正确链接我的项目时遇到问题。该项目是用 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                                                                                                                                                          

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

库位置是 /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*                                                                                                                               

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

4

1 回答 1

1

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

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

要么将 lib 留在本地路径中,要么在构建它时告诉链接器它将在哪里结束,或者复制到 /usr/local/lib 中,这是在链接器中硬编码的。请参阅Apple 开发人员关于动态库的说明

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

于 2012-06-27T12:19:49.420 回答