2016-04-09 49 views
1

我有一個編譯好的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 

回答

1

好吧,我花了一段時間來解決這個錯誤。我知道問題的一部分是設置運行路徑安裝名稱爲的庫,所以它們可以在鏈接和運行時找到,這將是您遇到的下一個問題。

我決定將圖書館建成一個共同的頂層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'選項的情況,並且不會再有更多的選項。 – trojanfoe