2009-05-05 12 views
1

私はLinuxとMac OS Xでコンパイルする必要のあるライブラリに取り組んでいます。今までは "-g"でコンパイルしても問題ありませんでした。Macで-O2のみでコンパイルすると未定義のシンボル

私はいくつかの最適化(「-O2」)を使用してコンパイルしようとしましたが、それがLinuxでうまく動作しますが、私は私のライブラリとプログラムをリンクしようとすると、私は、MAC OS Xの下未定義のシンボルを取得

は誰もい私は何を探すべきなのか?

/usr/bin/gcc -std=c99 CMakeFiles/prod-cons.dir/prod-cons.c.o -o prod-cons -rdynamic -L/home/claferri/dev/build/src ../src/libckaapi.a -lpthread -Wl,-rpath,/home/claferri/dev/build/src 
:ここ
154:00000018 C _the_symbol 
377:   U _the_symbol 

は、ライブラリを使用するプログラムのためのLinuxでのコンパイル行さ:

nm mylib.a | grep _the_symbol 

これは、LinuxおよびMacのために同じこと(無linuxの下に下線をリード)を返します

およびMacの場合:

/usr/bin/gcc -std=c99 -Wl,-search_paths_first -headerpad_max_install_names -fPIC CMakeFiles/prod-cons.dir/prod-cons.c.o -o prod-cons -L/Volumes/Data/claferri/Work/build/src ../src/libckaapi.a /usr/lib/libpthread.dylib 
+0

リンカのエラーを示すMac版のnmでは、ライブラリにシンボルが含まれていると表示されていますか? –

+0

はい!私は何が起こっているのかは分かりません。 – claf

+0

"_the_symbol"はソースコードに表示されていますか?初期化されていないグローバル変数ですか?あなたのソースコードで参照されていますか? –

答えて

0

以下は推測であり、使用しているコンパイラフラグを指定しない限り/私は確かに言えませんが、Xcodeのデフォルト設定は-fvisibility=hiddenです。これはあなたのライブラリ内のシンボルをほとんど隠すでしょうそれが目に見えるものとして宣言されている場合を除きます。

Linuxでも同じことができますが、GCCのデフォルトではシンボルを非表示にしていません。

あなたはここでより多くの情報を見つけることができます:http://gcc.gnu.org/wiki/Visibility

+0

コンパイルにはXCodeは使用しませんが、両方のOSでCMakeを使用します。 – claf

1

をここでは、回避策の推測です:-fno-共通フラグとライブラリを構築してみてください。この変数の定義が複数ある場合は、 "extern"を1つ以外のすべてに追加する必要があります。

+0

私はいくつかの変数を何度も定義していましたが、-fno-commonを使うと非常に分かりやすくなりました(コードの私の部分ではそうはっきりしていませんでしたが)面白いのは、未定義の変数ではないということです最初に...他の変数のextern定義でコンパイルされているようです。ありがとうございました! – claf

+0

実際、私が-fno-commonを削除しても、同じエラーが表示されます... なぜLinux上で動作し、Macでは動作しないのですか? – claf

+0

私の他の考えは、 * .aアーカイブ内の* .oファイルの順序。 "nm -A mylib.a | grep the_symbol"の出力を投稿できますか?おそらく、リファレンスを含むオブジェクトファイルの後に定義を含むオブジェクトファイルを移動することは、リンカーが適切なことをするのに役立ちます。 –

関連する問題