【问题标题】:Linking error when linking static libraries of QtCore.a链接 QtCore.a 的静态库时出现链接错误
【发布时间】:2016-09-29 21:10:08
【问题描述】:

我有一个文件

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 ,我不会收到构建错误,这是解决此问题的正确方法吗

期待反馈

【问题讨论】:

  • 为什么要重新定义 QtCore 函数?
  • 您是否只想在 myStubs.cpp 中拥有函数原型?
  • 为什么你还有myStubs.cpp 文件?为什么你认为你需要它?

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


【解决方案1】:

如果它是解决问题的正确方法,则取决于您首先拥有这些存根的原因。你不解释。

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

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

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

如果你想存根一些符号,并且想要做静态链接,你需要存根出qglobal.o中在程序中任何地方使用的所有符号。

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多