サードパーティのライブラリに依存する非常に単純なアプリケーションをコンパイルしてリンクしようとすると、「未定義の参照」エラーが発生します。非常に簡単なセットアップでC/C++のリンクの問題が発生する
私のmain.cは次のようになります。
#include "ss7cp.h"
/*
extern "C" {
void EINSS7CpMain_CpInit(void);
}
*/
int main() {
EINSS7CpMain_CpInit();
}
サードパーティのヘッダファイルがあります。
#if defined (__cplusplus) || defined (c_plusplus)
extern "C" {
#endif
...
void EINSS7CpMain_CpInit(void);
この関数の定義はアーカイブである:
$ nm -g /path/to/lib/libsign_64_uthr.a | grep EINSS7CpMain_CpInit 0000000000005ae0 T EINSS7CpMain_CpInit U EINSS7CpMain_CpInit U EINSS7CpMain_CpInit
上記の "T"によって、関数はアーカイブ内のlibのいずれかのtext/codeセクションで定義されていなければなりません。
は、私は現在、Makefileを使用していないが、ちょうどすぐにコマンドラインから完全にこのシンプルなアプリを構築しようとしている:
g++ -I/path/to/include -L/path/to/lib -lsign_64_uthr -D__EXTENSIONS__ -DLINUX main.cが(ドキュメントが
__EXTENSIONS__
と
LINUX
の両方を定義するために私に言いました)。上記の残りの部分はかなり簡単です。私は何を取得していことです:
/tmp/ccvgmIJ8.o: In function `main': main.c:(.text+0x5): undefined reference to `EINSS7CpMain_CpInit' collect2: error: ld returned 1 exit status
私はCファイル(main.cの)とC++ファイル(main.cppに、extern "C"
ブロックを有効にする)、ないの差としての両方を試してみました。 (g ++はファイル拡張子だけでC++とC++を決定すると仮定できますか?)
私はファイルを(-c
で)コンパイルして、結果のmain.oオブジェクトファイルとsawの内容を見ましたテキスト「EINSS7CpMain_CpInit」はそのままで、まったく問題ありません(またはそれは単なるデバッグシンボルですか?)
何が欠落しているかを確認するための診断手順はありますか?私は実際にMakefileを作成し、コンパイルとリンクのステップを分割する必要がありますか?
私は最後にC/C++をやってから何年も経ちました。私は通常、Makefilesを最初から作成しなければならない人ではありませんでした。 ...
_「私は、ファイル拡張子によって++ C対Cを決定++グラムを想定することはできますか?」_ありません –
'nm -u main.o'は私に' U EINSS7CpMain_CpInit'を与えています。だから私はこれが単なる名前のマングリングの問題ではないと仮定していますか? –
_ "私が取ることができる診断のステップは何ですか?" _ nmはリンクされたライブラリにあるシンボルについて教えてくれるのですか? –