linux – 无法将应用程序与mudflap链接

我的应用程序使用我的共享库.必须对应用程序和库进行混淆,以检查超出堆栈和堆的读写区域.共享库已成功构建,但在链接应用程序时,我遇到了很多错误.

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

>使用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

但是,如果我删除了库的mudflap编译器和链接器标志,应用程序的构建将成功完成.
但事实并非如此,反之亦然.

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

最佳答案 删除#include< iostream>来自你的头文件.如果要包含iostream,请在源(SharedLibTest.cpp)文件中执行此操作.

将它包含在头文件中也包含大量垃圾,也可能导致一些像这样的引用错误.创建没有包含的SharedLibTest.o并比较目标文件的大小.

点赞