C++共有ライブラリプロジェクトのグローバル変数に問題があります。私のライブラリは、dllとしてだけでなく、標準のg ++共有ライブラリ(.so)としても機能する必要があります。私はファイルlibiup_dll.cppとlibiup_dll.hを作成することによってこれを行いました。
#ifdef BUILD_DLL
// code for the dll: wrapper functions around the classes in my shared library
#endif
私のdllには、関数setloglevel(int)とgeterrormsg()が必要です。すべてのクラスで、グローバル変数errormsgにすべてのエラーメッセージを追加します。この変数は、geterrormsg()関数によって返される必要があります。私はこれを使用して実装しました
std::string errormsg;
int loglevel;
libiup_dll.h(outsideおよび#ifdefsなので、グローバルに利用可能である必要があります)に入れてから、
extern std::string errormsg;
extern int loglevel;
私のクラスの.hファイル(クラスの外、ファイルの上部)
今私は2つの問題があります:
1)ライブラリを使用するg ++でコマンドラインプログラムをコンパイルすると、エラーが発生します
ターゲットの構築:libiup_test呼び出し:GCCC++リンカーg++-L "/ home / hilboll / src / libiup / Release" -L / usr / local / lib -o "libiup_test" ./src/stratcalc/SimpleStratosphericColumnCalculatorTest.o ./src/ interp / SimpleInterpolatorTest.o ./src/Test.o -lgsl -lhdf5 -lhdf5_cpp -lblas -liup /home/hilboll/src/libiup/Release/libiup.so:errormsgへの未定義の参照
loglevel' /home/hilboll/src/libiup/Release/libiup.so: undefined reference to
'collect2:ldが1つの終了ステータスを返しましたmake :***[libiup_test]エラー1
私のコマンドラインプログラムでは、errormsgやloglevelへの参照はまったくありません。
2)VS2008を使用してWindowsでdllをコンパイルしようとすると、
z:\ src \ vs \ libiup_dll \ libiup_dll.h(229):エラーC2086:'std :: string errormsg':Neudefinition z:\ src \ libiup \ src \ stratcalc ../ interp / SimpleInterpolator.h(16): Siehe Deklaration von'errormsg' z:\ src \ vs \ libiup_dll \ libiup_dll.h(234):エラーC2086:'int loglevel':Neudefinition z:\ src \ libiup \ src \ stratcalc ../ interp / SimpleInterpolator.h( 17):Siehe Deklaration von'loglevel'
私が理解している限り、VSは2つの変数を2回定義していると考えていることを意味します。ただし、SimpleInterpolator.h 16/17には、extern宣言のみがあります...
どういうわけか、グローバル変数がどのように機能するかをまだ理解していないようです。どんな助けでも大歓迎です!