2017-02-12 10 views
-1

Apple LLVMバージョン8.0.0(clang-800.0.42.1)を使用してコンパイルしています。それは約1200ファイルですが、私はそれらを以前使用しています。私は行ってそれらをすべてコンパイルしますが、問題はありません。私は静的ライブラリ(ar rcs libblib.a *.o)を作成しますが、問題はありません。だから私の新しい図書館を使用しようとすると、私の問題があります。静的ライブラリリンクの問題定義されているシンボルの "未定義シンボル"

gcc main.c -L. -lblib 
Undefined symbols for architecture x86_64: 
    "_N_method", referenced from: 
     _main in main-7fc584.o 
ld: symbol(s) not found for architecture x86_64 

しかし、これは定義されています。私はファイルが(ar -t libblib.a | grep N_METHOD.o)含まれていることを確認してそこにあります。ソースファイルをチェックすると、ヘッダーファイルにあるように正確に名前が付けられたメソッドが存在します。私はここで何を問題にしていますか?私は完全な喪失に瀕しており、私は単純なものを見逃していると思っています。

私は nm -g N_METHOD.oを行なったし、戻った:

0000000000000000 T __Z8N_methodP6stacks 
+1

ライブラリはCまたはC++で記述されていますか?それがC++の場合、名前は変更されます。 – Barmar

+0

@Barmar:Cは_methods_をサポートしていません、OccamのカミソリはこれがC++だと伝えます;-) – Olaf

+0

それはCです。私はちょうどN_methodをプレースホルダとして使用しています。 – Red

答えて

0

答えにコメントを転送します。質問内容に基づいて

、私は尋ねた:

  • あなたはN_METHOD.oは、64ビットのオブジェクトファイル(または32ビットと64ビットの両方のコードと脂肪のオブジェクトファイルであることを確認しましたその中に)? 32ビットオブジェクトファイルの場合、64ビットプログラムでは使用されません。しかし、これはほとんど起こりそうにない。 Macで32ビットのオブジェクトファイルを作成するには、あなたの道を離れなければなりません。

  • nm -g N_METHOD.oを実行して、_N_methodがオブジェクトファイルに定義されているかどうかを確認しましたか?

私はnm -g N_METHOD.oを行なったし、戻った:

0000000000000000 T __Z8N_methodP6stacks 

をC++コンパイラでCコードをコンパイルしないでください。あるいは、CコンパイラでC++コードをコンパイルしようとしないでください。変更された名前(__Z8N_methodP6stacks)はC++用です。 gccの代わりにg++とリンクするだけでいいですか?彼らは異なる言語です - とのコンパイルとリンク - これは最初のステップCの特性++とC

に全く不明である「タイプセーフリンケージ」のプロパティである:ソースと仮定すると

g++ main.c -L. -lblib 

CのC++サブセット(またはC++のCサブセット)にある場合、動作するはずです。少なくとも、コードにN_Method(&xyz)が含まれており、xyzがタイプstacksの変数である場合は、__Z8N_methodP6stacksを呼び出す可能性があります。

次のコード

typedef struct stacks stacks; 
extern int N_method(stacks*); 

extern int relay(stacks *r); 

int relay(stacks *r) { return N_method(r); } 

nm -g出力を生成するためのC++コンパイラでコンパイル:

0000000000000000 T __Z5relayP6stacks 
       U __Z8N_methodP6stacks 

またnm -g出力を生成するCコンパイラでコンパイル:

0000000000000038 s EH_frame1 
       U _N_method 
0000000000000000 T _relay