我的应用程序使用我的共享库。 应用程序和库必须用mudflapped
来检查在堆栈和堆栈上的读写边界。 共享库成功构build,但在链接应用程序时,我有很多错误。
我做了一个简单的例子,再现这个问题。 以下是重现的步骤:
#include <iostream>
这是我的文件:
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 。