私のアプリケーションは共有ライブラリを使用しています。アプリケーションとライブラリはmudflapped
、スタックとヒープの両方で範囲外の読み取りと書き込みをチェックアウトする必要があります。共有ライブラリは正常にビルドされましたが、アプリケーションのリンク中に多くのエラーが発生しました。
この問題を再現する簡単な例を作成しました。再現する手順は次のとおりです。
- 2 つのファイルを使用して C++ 動的共有ライブラリ プロジェクトを作成します。いくつかのクラスを含む h および cpp ファイルと、h または cpp ファイルでの使用
#include <iostream>
- このライブラリを使用する C++ アプリケーションを作成します (共有ライブラリ内のクラスを使用します)
- ライブラリを構築する
- アプリケーションをビルドします (ここでリンク エラーが発生します)。
ここに私のファイルがあります:
SharedLibTest.h
#ifndef SHAREDLIBTEST_H_
#define SHAREDLIBTEST_H_
#include <iostream>
class SharedLibTest {
public:
void func();
};
#endif /* SHAREDLIBTEST_H_ */
SharedLibTest.cpp
#include "SharedLibTest.h"
void SharedLibTest::func()
{}
main.cpp
#include <SharedLibTest.h>
int main(int argc, char *argv[])
{
SharedLibTest obj;
obj.func();
return 0;
}
ライブラリの構築:
g++ -O0 -g3 -Wall -c -fmessage-length=0 -fmudflap -funwind-tables -fPIC -MMD -MP -MF"SharedLibTest.d" -MT"SharedLibTest.d" -o "SharedLibTest.o" "../SharedLibTest.cpp"
g++ -rdynamic -shared -o "libshared_lib.so" ./SharedLibTest.o -lmudflap
アプリケーションの構築:
g++ -I"/home/msviridov/work/prj/workspace/shared_lib" -O0 -g3 -Wall -c -fmessage-length=0 -fmudflap -funwind-tables -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
g++ -L"/home/msviridov/work/prj/workspace/shared_lib/Debug" -rdynamic -v -o "executable" ./main.o -lshared_lib -lmudflap
リンカのエラー出力は次のとおりです。
/home/msviridov/work/prj/workspace/shared_lib/Debug/libshared_lib.so: undefined reference to `__gnu_cxx::__numeric_traits_integer<unsigned long>::__digits'
/home/msviridov/work/prj/workspace/shared_lib/Debug/libshared_lib.so: undefined reference to `__gnu_cxx::__numeric_traits_integer<long>::__min'
/home/msviridov/work/prj/workspace/shared_lib/Debug/libshared_lib.so: undefined reference to `__gnu_cxx::__numeric_traits_integer<short>::__min'
/home/msviridov/work/prj/workspace/shared_lib/Debug/libshared_lib.so: undefined reference to `__gnu_cxx::__numeric_traits_integer<char>::__max'
/home/msviridov/work/prj/workspace/shared_lib/Debug/libshared_lib.so: undefined reference to `__gnu_cxx::__numeric_traits_integer<short>::__max'
/home/msviridov/work/prj/workspace/shared_lib/Debug/libshared_lib.so: undefined reference to `__gnu_cxx::__numeric_traits_integer<long>::__max'
/home/msviridov/work/prj/workspace/shared_lib/Debug/libshared_lib.so: undefined reference to `__gnu_cxx::__numeric_traits_integer<int>::__max'
/home/msviridov/work/prj/workspace/shared_lib/Debug/libshared_lib.so: undefined reference to `__gnu_cxx::__numeric_traits_integer<int>::__min'
collect2: ld returned 1 exit status
make: *** [executable] Error 1
ただし、ライブラリのマッドフラップ コンパイラとリンカー フラグを削除すると、アプリケーションのビルドは正常に終了します。しかし、その逆は当てはまりません。
何がそのような結果につながるのか理解できません。私のプラットフォームは Linux Mint 13 Maya 64 ビットです。どんな助けにも感謝します。ありがとう。