微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法链接应用程序与mudflap

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

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

用2个文件创buildC ++dynamic共享库项目:h和cpp文件与一些类,在h或cpp文件中使用#include <iostream>

创build使用该库的C ++应用程序(使用共享库内部的类)

build立图书馆

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?

.so调用符号

可以(应该?)创build自己的线程的本地共享库支持退出“没有警告”的使用过程?

部署依赖于共享库的Linux应用程序的可接受方法是什么?

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐