我的应用程序使用我的共享库。 应用程序和库必须用mudflapped来检查在堆栈和堆栈上的读写边界。 共享库成功构build,但在链接应用程序时,我有很多错误。
我做了一个简单的例子,再现这个问题。 以下是重现的步骤:
用2个文件创buildC ++dynamic共享库项目:h和cpp文件与一些类,在h或cpp文件中使用#include <iostream>
创build使用该库的C ++应用程序(使用共享库内部的类)
build立图书馆
这是我的文件:
SharedLibTest.h
用C ++为OSX创build共享库
什么是共享库中全局声明的非POD对象的语义?
从64位应用程序使用32位共享库?
dynamic加载时的库path?
有没有一种方法可以确定Linux上库的线程本地存储模型
#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位。 我会感谢任何帮助。 谢谢。
如何防止从静态链接库中导出符号?
如何在共享库(.so)中使用共享库的同一进程的实例共享全局variables?
可以(应该?)创build自己的线程的本地共享库支持退出“没有警告”的使用过程?
部署依赖于共享库的Linux应用程序的可接受方法是什么?
从头文件中删除#include <iostream> 。 如果你想包括iostream在你的源代码(SharedLibTest.cpp)文件中。
将它包含在头文件中也包含了很多垃圾,也可能导致一些这样的引用错误。 创建SharedLibTest.o而不包含和比较目标文件的大小。
您可能正在碰到bug 53359,但是您最近需要检查4.8代码。 此外,请注意,mudflap是C和非常简单的C ++程序,所以你可能会发现错误的possitives ( 错误19319 ),它不适用于DSO 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。