C, C++の初学者です。
既存の静的ライブラリに新しい関数(newFunc.cpp
とnewFunc.h
)を追加したのですが、ライブラリのコンパイル後、他のヘッダファイルからincludeしても、リンカが「シンボルが見つからない」とエラーを吐いてしまいます。(そのライブラリに含まれる他の既存の.cppファイルで定義されている関数へのリンクは成功していることを確認しています)
試しに生成されたライブラリの.aファイル、libEncLib.a
をnm
してみたのですが、
libEncLib.a(newFunc.o): libEncLib.a(Stream.o): 00000000000010fc s GCC_except_table1 00000000000012a4 s GCC_except_table101 00000000000012f0 s GCC_except_table105 000000000000113c s GCC_except_table11 0000000000001310 s GCC_except_table112
といった具合に、追加したファイルに記載されている関数についてはシンボルが記載されていません。
なお、ライブラリに既存のcppファイルに、追記する形で新しい関数を定義した時は、当然リンクできています。
下記にも書いてありますが、一応XcodeのBuild Phasesでは追加したcpp/hファイルを追加していますが、それだけではダメなようです。どうすれば追加cpp/hファイル内で定義した関数のシンボルが記述されるでしょうか?
以下、プロジェクトの詳細です。
Xcodeのプロジェクト構成について
- EncLibターゲットと、EncAppターゲットの2種類のビルドターゲットが存在する。
- EncAppターゲットに含まれるcppファイル内では度々EncLibターゲットのビルド結果のEncLib.a内に記述されている関数やクラスをincludeして用いる。
やったこと
- 既存のEncLibターゲットに新たに
newFunc.cpp
、newFunc.h
を追加。(プロジェクトに既存ファイルを読み込み) - XcodeのEncLibターゲットのBuild Phases => HeadersとCompile Sourcesにそれぞれ
newFunc.h
、newFunc.cpp
を追加。 - EncAppターゲットの
encmain.cpp
のmain()
関数で、EncLibターゲットのnewFunc.cpp
に定義されているtestInt(){return 1000;}
関数を呼ぶ。(もちろん#include "EncLib/newFunc.h"
してる) - EncLibターゲットをビルド(成功)
- EncAppターゲットをビルド(失敗)
なお、変更前はAppターゲットもビルド成功していました。
エラー文は下記のとおりです。
Undefined symbols for architecture x86_64: "testInt()", referenced from: _main in encmain.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/16 03:17
2016/06/16 10:02
2016/06/17 06:31