无法链接应用程序与mudflap

我的应用程序使用我的共享库。 应用程序和库必须用mudflapped来检查在堆栈和堆栈上的读写边界。 共享库成功构build,但在链接应用程序时,我有很多错误。

我做了一个简单的例子,再现这个问题。 以下是重现的步骤:

  • 用2个文件创buildC ++dynamic共享库项目:h和cpp文件与一些类,在h或cpp文件中使用#include <iostream>
  • 创build使用该库的C ++应用程序(使用共享库内部的类)
  • build立图书馆
  • build立应用程序(在这里你会看到一个链接错误)

这是我的文件:

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; } 

build立图书馆:

 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 

构build应用程序:

 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 

但是,如果我删除mudflap编译器和链接器标志库的应用程序的构build将成功完成。 但是反之亦然。

我不明白是什么导致了这样的结果。 我的平台是Linux Mint 13 Maya 64位。 我会感谢任何帮助。 谢谢。

从头文件中删除#include <iostream> 。 如果你想包括iostream在你的源代码(SharedLibTest.cpp)文件中。

将它包含在头文件中也包含了很多垃圾,也可能导致一些这样的引用错误。 创建SharedLibTest.o而不包含和比较目标文件的大小。

您可能正在碰到bug 53359,但是您最近需要检查4.8代码。 此外,请注意,mudflap是C和非常简单的C ++程序,所以你可能会发现错误的possitives ( 错误19319 ),它不适用于DSO 。