Ошибка компоновки при компоновке статических библиотек QtCore.a

У меня есть файл

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) Если я удаляю qMalloc, qFree и qRealloc из файла myStubs.cpp, я не получаю ошибку сборки, это правильный способ решения этой проблемы

Ждем отзывов

0

Решение

Если это правильный Способ решения проблемы зависит от того, почему у вас есть эти заглушки в первую очередь. Вы не объясняете это.

Но статическое связывание работает, просматривая каждую библиотеку по очереди, чтобы увидеть, есть ли какой-либо член, который разрешил бы любые символы, еще не разрешенные в тот момент. Так что ваши myStubs.o разрешает один или несколько символов, неразрешенных в этой точке. Этот файл включается, и все символы в этом файле становятся частью исполняемого файла, который вы создаете.

Когда компоновщик позже увидит qglobal.o он содержит некоторые дополнительные символы, которые еще не разрешены. Затем он пытается включить этот файл в исполняемый файл.

Но затем два определения символов становятся частью исполняемого файла, и это не законно. Таким образом сообщение об ошибке.

Если вы хотите заглушить некоторые символы и хотите сделать статическое связывание, вам нужно заглушить все символы в qglobal.o которые используются в любом месте в программе.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]