MinGW がリンクできる MS Visual Studio 2012 を使用して静的ライブラリを作成しようとしています (このプロセスの MinGW 側を Code::Blocks で処理しています)。
名前マングリングの問題を回避するために、ライブラリ インターフェイスはextern "C"
ブロック内で宣言され、 C と C++ の両方に共通のデータ型のみを使用します。この予防措置にもかかわらず、MinGW は、ライブラリにリンクするプロジェクトをコンパイルしようとすると、未定義の参照エラーを返します。
ライブラリ ファイルは、VS 2012 で LibTest.h と LibTest.cpp の 2 つのファイルからコンパイルされます (これらは問題を示す簡単な例です)。
// LibTest.h
#ifndef LIBTEST_H
#define LIBTEST_H
extern "C" {
int Test(int input);
}
#endif
// LibTest.cpp
#include "LibTest.h"
extern "C" {
int Test(int input){
return (input + 5);
}
}
VS 2012 はこれをスタティック ライブラリ (LibTest.lib) としてコンパイルしますが、問題はありません。MinGW のテスト プログラムは次のとおりです。
// LibTest.lib is linked in the project settings
#include "LibTest.h" // Same LibTest.h as above
int main(){
int x = 5;
int a = Test(x);
return 0;
}
これをコンパイルしようとすると、未定義の参照エラー (名前がマングルされたライブラリをリンクしようとしたときに生成されるエラーと同じ) でプロセスが失敗します。名前マングリングの問題を防ぐために を使用することを期待していますがextern "C"
、クロスコンパイラ互換のライブラリを作成しようとしたのはこれが初めてなので、おそらく何か他のものを見逃しています.
提案やコメントをいただければ幸いです。