質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

5389閲覧

Xcodeで静的ライブラリに追加コンパイルした関数のシンボルが見つからない

shutosg

総合スコア20

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/06/15 00:11

編集2016/06/15 00:17

C, C++の初学者です。
既存の静的ライブラリに新しい関数(newFunc.cppnewFunc.h)を追加したのですが、ライブラリのコンパイル後、他のヘッダファイルからincludeしても、リンカが「シンボルが見つからない」とエラーを吐いてしまいます。(そのライブラリに含まれる他の既存の.cppファイルで定義されている関数へのリンクは成功していることを確認しています)
試しに生成されたライブラリの.aファイル、libEncLib.anmしてみたのですが、

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のプロジェクト構成について

  1. EncLibターゲットと、EncAppターゲットの2種類のビルドターゲットが存在する。
  2. EncAppターゲットに含まれるcppファイル内では度々EncLibターゲットのビルド結果のEncLib.a内に記述されている関数やクラスをincludeして用いる。

やったこと

  1. 既存のEncLibターゲットに新たにnewFunc.cppnewFunc.hを追加。(プロジェクトに既存ファイルを読み込み)
  2. XcodeのEncLibターゲットのBuild Phases => HeadersCompile SourcesにそれぞれnewFunc.hnewFunc.cppを追加。
  3. EncAppターゲットのencmain.cppmain()関数で、EncLibターゲットのnewFunc.cppに定義されているtestInt(){return 1000;}関数を呼ぶ。(もちろん#include "EncLib/newFunc.h"してる)
  4. EncLibターゲットをビルド(成功)
  5. 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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

newFunc.cpp がlibEncLib.aをターゲットとしてビルドされていることは確認されましたか?

手っ取り早い方法は newFunc.cpp に絶対にコンパイルが通らないコードを埋め込んで EncLibターゲットをビルド してみることです。エラーにならなければコンパイルされていません。

投稿2016/06/15 06:50

satoren

総合スコア109

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shutosg

2016/06/16 03:17

ご回答ありがとうございます。お返事が遅れてしまって申し訳ありません。 >newFunc.cpp がlibEncLib.aをターゲットとしてビルドされていることは確認されましたか? これは、newFunc.cppのTarget MembershipのEncLibにチェックが入っているということでしょうか? と思ったのですが、newFunc.cppに適当なコードを混ぜてもエラーが出なかったのでコンパイルされていないようでした… XcodeでnewFunc.cppがlibEncLib.aのターゲットになるような設定を探ってみようと思います
satoren

2016/06/16 10:02

projectの設定でlibEncLibのtarget を選択し、 Build Phasesタブを選択してCompile Sourcesのリスト内に表示されているファイルがコンパイル対象のソースコードになります。
shutosg

2016/06/17 06:31

そちらの設定ならきちんとnewFunc.cppを登録していますし、HeadersにもnewFunc.hを登録しているんですよね… http://blog.kishikawakatsumi.com/entry/20120308/1331219362 にある「xcode4.3にソースファイルをドラッグアンドドロップしてビルドしたら、そんなシンボル無いと叱られた。メニューからadd filesをしたら直った。バグか?」とコメントがあったので、「お!これか!」と思ってadd filesでも試してみたのですが、相変わらず同じ状況です。。。 Xcodeもほぼ初めて使っているのでどこか見落としがあるのだと思うのですが、、、
guest

0

状況がよく見えないので推測ですが、main.cpp が含まれるプロジェクトのプロジェクト設定の Link Binary With Libraries に EncLib.a を追加していますか?

投稿2016/06/15 02:56

pebble8888

総合スコア390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shutosg

2016/06/15 03:01

ご回答ありがとうございます。 はい。追加されています。というかEncLib.aは既存のライブラリなので、もともと追加されていました。そして、当然それに含まれている他のcppファイルに記述されている関数やクラスは正常に動作します。 新たにライブラリに追加したnewFunc.cppとnewFunc.hで定義される関数のみが、シンボルが見つからずエラーが出てしまいます。
pebble8888

2016/06/15 04:07

なるほど。これらの情報から原因を特定するのは難しいですね。Minimalなサンプルを新規に作って差分を検証するのが良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問