2016-04-09 9 views
1

私は、Xcode 7.2以前ではコンパイルされたプロジェクトがありますが、gets linker errors when compiling with Xcode 7.3です。私は問題を複製するsimple example projectに絞ることができました。Xcode 7.3 +相対パスへのリンク= ld:ファイルが見つかりません:../lib/lib_.dylib

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

lib3lib2とのリンク、およびlib1lib2リンク:

基本的なプロジェクト構造は次のようです。ライブラリがコンパイルされると、その出力はsrcディレクトリに対して../libディレクトリにあります。

lib3をコンパイルしようとすると、../../one/libがライブラリ検索パスに含まれていても、file not found: ../lib/lib1.dylibでエラーが発生します。

検索パスを正常に機能させるために、私は奇妙で神秘的なリンカーフラグを使用できますか?またはこれは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ディレクトリに作成するために解決しましたが、最終的には実際には必要ではないことは確かですが、渡されるコマンドラインオプションを削減しましたリンカーはldではなくリンクのためにccを使用しているので、-Wl,-linker-option-Wl,linker-option-argumentで処理する必要がありますので非常に面倒です。

私は、実際の答えはあなたのthree/src/Makefileラインに-l1を追加することであると思う:

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

これはlib3lib2に依存しているかのように、追加する必要はありません必要があった理由は、私にははっきりしていないlib2リンカの行への依存関係。これはおそらくあなたが以前に使用したオプションを見たことがないので、-undefined dynamic_lookupの使用と関係しています。しかし、私はこれを完全に実験する時間がなかった。あなたがMakefile秒のバージョンにこの変更を加えた場合

おそらくとあなたは../../one/lib../../two/lib-L(に渡されたものは何でもから暗示されているインストール実行パスとして実行時の問題を持っていますし、彼らがほとんどでしょう確かに実行時に間違っている)。そのためには、明示的に実行パスを設定し、をインストールすることをお勧めだし、すべてのライブラリが@loader_path/に自分実行パスセットを持っていたし、彼らの@rpath/libX.dylibに名前セットををインストールします。これらのライブラリを使用する実行可能ファイルは、ライブラリを見つけるために異なる実行パスを必要とします。

私が行った変更についてはpull requestを参照してください。

この質問をgithubでホストされているテスト可能なプロジェクトでどのように提示したかについてお礼申し上げます。あなたはまともなフィードバックを得ることはほとんどありません。

+0

詳細な回答ありがとうございます。実際のプロジェクトでlibディレクトリを組み合わせるオプションはありませんが、その他の情報は非常に役立つはずです。 FWIW、-undefined dynamic_lookupは、リンク時に未定義シンボルを実行時に動的に解決するようにします。私はそれが私の問題の原因であるのだろうかと思っています。 – leedm777

+0

@ leedm777私はしなくてもやっていきます。ライブラリを別々にするためには、 '$(LD)'の '-Wl、'オプションのうちの多くを渡すことが必要です。 – trojanfoe

関連する問題