Xcode 7.3 +链接到相对路径= ld:找不到文件:../lib/lib_.dylib

问题描述:

我有一个编译好的Xcode 7.2和更早版本的项目,但是gets linker errors when compiling with Xcode 7.3。我已经能够缩小到一个simple example project重复的问题。Xcode 7.3 +链接到相对路径= ld:找不到文件:../lib/lib_.dylib

的基本项目的结构是这样的:有lib2

. 
├── one 
│   ├── lib 
│   │   └── lib1.dylib 
│   └── src 
│    └── one.c 
├── two 
│   ├── lib 
│   │   └── lib2.dylib 
│   └── src 
│    └── three.c 
└── three 
    ├── lib 
   │   └── lib3.dylib 
    └── src 
     └── two.c 

lib3联系,并与lib1lib2链接。编译库时,其输出位于目录中,相对于其目录src

当我尝试编译lib3时,它与file not found: ../lib/lib1.dylib错误,即使../../one/lib位于库搜索路径中。

我可以使用什么奇怪而神秘的链接器标记来获得搜索路径吗?或者这是Xcode的错误?

/Applications/Xcode.app/Contents/Developer/usr/bin/make -C one/src 
cc -I ../../include -c -o one.o one.c 
cc -dynamiclib -undefined dynamic_lookup -flat_namespace -o ../lib/lib1.dylib one.o 
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C two/src 
cc -I ../../include -c -o two.o two.c 
cc -dynamiclib -undefined dynamic_lookup -flat_namespace -L ../../one/lib -o ../lib/lib2.dylib two.o -l1 
/Applications/Xcode.app/Contents/Developer/usr/bin/make -C three/src 
cc -I ../../include -c -o three.o three.c 
cc -dynamiclib -undefined dynamic_lookup -flat_namespace -L ../../two/lib -L ../../one/lib -o ../lib/lib3.dylib three.o -l2 
ld: file not found: ../lib/lib1.dylib for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make[1]: *** [../lib/lib3.dylib] Error 1 
make: *** [all] Error 2 

好吧,我花了一段时间来解决这个错误。我知道问题的一部分是设置运行路径安装名称为的库,所以它们可以在链接和运行时找到,这将是您遇到的下一个问题。

我决定将图书馆建成一个共同的顶层lib目录,但是在一天结束时,我确信实际上并不是必需的,但它确实减少了传递给命令行选项这是非常繁琐的连接器,因为它需要使用-Wl,-linker-option-Wl,linker-option-argument完成,因为您正在使用cc进行链接,而不是直接使用ld

我认为实际的答案是添加-l1three/src/Makefile行:

$(LD) -o [email protected] $< -l2 -l1 

这不是很清楚,我为什么仿佛lib3取决于lib2那么它不应该有必要添加lib2,这是必要的对链接器行的依赖关系。这可能与您使用-undefined dynamic_lookup有关,因为我从未见过此选项。但是,我没有时间对此做充分的实验。

如果你做出这个改变你的Makefile S的版本,你将有可能运行的问题作为运行路径安装名称是隐含的,从任何你传递给-L(这是../../one/lib../../two/lib和他们几乎在运行时肯定会出错)。因此,最好明确设置运行路径安装名称,每个库有自己的运行路径设置为@loader_path/及其安装名称设置为@rpath/libX.dylib。使用这些库的可执行文件可能需要不同的运行路径才能找到这些库。

请参阅我的pull request了解我所做的更改。

我想赞扬你如何用github上托管的可测试项目来表达这个问题;没有,你不可能得到任何体面的反馈。

+0

感谢您的详细解答。我没有在实际项目中组合lib目录的选项,但其他信息应该非常有用。 FWIW,-undefined dynamic_lookup会导致链接时未定义的符号在运行时动态解析。我不知道这是否是我的一些问题的原因... – leedm777

+0

@ leedm777我会尝试没有。为了保持这些库独立,它应该只是在'$(LD)'中传递更多'-Wl'选项的情况,并且不会再有更多的选项。 – *foe