C で書かれた中規模 (10,000 行程度) のプログラムを C++ プログラムに統合しています。C コードへのインターフェイスとして新しいクラスを作成したBWAGenome
ので、C 関数へのアクセスはすべてカプセル化されます。私はコンパイラですべてをコンパイルしていg++
ます。.o ファイルはすべて正しく生成されますが、それらを最終的な実行可能ファイルにリンクしようとすると、コンパイラはシンボルが見つからないと文句を言います。これが私が得るエラーメッセージです:
Undefined symbols:
BWAGenome::BWTRestoreBWT(char const*)", referenced from:
BWAGenome::BWAGenome(char const*)in BWAGenome.o
"BWAGenome::GetMatches(unsigned int, int, bwt_t*, bwt_t*, bwt_t*, bntseq_t*, bntseq_t*)", referenced from:
BWAGenome::getMatches(unsigned int, int)in BWAGenome.o
これらの関数はすべて、私が作成した C++ クラスにあります。それらは C コードで関数をラップしますが、シンボルがどのように未定義になる可能性があるのか まったくわかりません。
コードとこれまでに行ったことについての詳細:
- すべてが でコンパイルされて
g++
いるので、正しく理解すれば、extern "C" {};
インクルードする c ヘッダー ファイルを囲む必要はありません。 - すべてのコードが個別に正しくコンパイルされます。エラーは、リンク中にのみ発生します。
- Cコードを静的関数から呼び出す必要があるかもしれないとどこかで聞いたので、C関数への各呼び出しを静的クラスメソッド内にラップして、代わりにそれを呼び出してみました。
この問題を解決する方法についてのアイデアはありますか?
編集: BWTRestoreBWT と GetMatches の定義と宣言を追加
//definition in BWAGenome.h
static bwt_t * BWTRestoreBWT(const char *fn);
//declaration in BWAGenome.cpp
static bwt_t * BWTRestoreBWT(const char *fn) {
return bwt_restore_bwt(fn);
//bwt_restore_bwt is a function in the C code that I am attempting to integrate
}
2番目の編集:多くの魂の検索の後、問題は私が考えていたもののほとんどとはまったく無関係であることに気付きました. 詳細については、私の回答を参照してください。