链接QtCore.a的静态库时链接错误

时间:2016-09-29 21:10:08

标签: c++ qt static-linking stub linker-errors

我有一个文件

1)文件myStubs.cpp

 #include <stdlib.h>
 #include <new>

 void*     qMalloc(size_t sz)             {return malloc(sz);}
 void      qFree(void* ptr)               {free(ptr);}
 void*     qRealloc(void* ptr, size_t sz) {return realloc(ptr, sz);}

我从这个文件中创建一个静态库

1) g++ -fPIC -c myStubs.cpp -o lib_mylib.o
2) ar rcs libMyLib.a lib_mylib.o

在Qt Core中我们有文件qglobal.cpp

2)文件是qt-x11-opensource-src-4.3.3 / src / corelib / global / qglobal.cpp,此文件中的上述功能与

相同
 /*
 These functions make it possible to use standard C++ functions with
 a similar name from Qt header files (especially template classes).
*/
Q_CORE_EXPORT void *qMalloc(size_t size);
Q_CORE_EXPORT void qFree(void *ptr);
Q_CORE_EXPORT void *qRealloc(void *ptr, size_t size);

当我链接静态库libMyLib.a和QtCore(libQtCore.a)和QtGui(libQtGui.a)的静态库时。我遇到了构建错误

lib/libQtCore.a(qglobal.o): In function `qMalloc(unsigned long)':
qglobal.cpp:(.text+0x170): multiple definition of `qMalloc(unsigned long)'
libMyLib.a(myStubs.o):myStubs.cpp:(.text+0x0): first defined here

问题

1)如果我从文件myStubs.cpp中删除qMalloc,qFree和qRealloc,我没有得到构建错误,这是解决此问题的正确方法

期待反馈

1 个答案:

答案 0 :(得分:0)

如果正确解决问题的方法取决于你首先拥有这些存根的原因。你没有解释。

但静态链接的工作原理是依次查看每个库,以查看是否有任何成员可以解析此时尚未解析的任何符号。因此,您的myStubs.o会解析此时尚未解决的一个或多个符号。该文件包含在内,该文件中的所有符号将成为您构建的可执行文件的一部分。

当链接器稍后看到qglobal.o时,它包含一些尚未解析的附加符号。然后它尝试在可执行文件中包含该文件。

但是,符号的两个定义成为可执行文件的一部分,这是不合法的。因此错误信息。

如果你想要删除一些符号,并想要进行静态链接,你需要在qglobal.o中删除所有在程序中任何地方使用的符号。