4

私のアプリケーションは共有ライブラリを使用しています。アプリケーションとライブラリは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 ビットです。どんな助けにも感謝します。ありがとう。

4

2 に答える 2

3

#include <iostream>ヘッダー ファイルから削除します。含める場合iostreamは、ソース (SharedLibTest.cpp) ファイルに含めます。

ヘッダーファイルに含めると、大量のゴミも含まれ、このような参照エラーが発生する可能性があります. そのインクルードなしで SharedLibTest.o を作成し、オブジェクト ファイルのサイズを比較します。

于 2012-12-04T21:54:45.027 に答える
0

おそらくバグ 53359が発生していますが、確認するには最新の 4.8 コードが必要です。さらに、マッドフラップはC および非常に単純な C++ プログラム用であるため、誤検知 (バグ 19319 )が見つかる可能性があり、DSO ではまだ動作しないことに注意してください。

于 2013-02-14T12:28:59.823 に答える