2016-09-29 3 views
0

У меня есть файлСвязывание ошибки при связывании статических библиотек из 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 и sam е функции, как выше в этом файле

/* 
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, я не получаю сообщение об ошибке сборки, Является ли это правильным способом решения этой проблемы

Заглядывая вперед для обратной связи

+2

Почему вы переопределяете функции QtCore? – mascoj

+0

Возможно, вы захотите только иметь прототипы функций в myStubs.cpp? –

+0

Почему у вас даже есть файл 'myStubs.cpp'? Почему, по-вашему, вам это нужно? –

ответ

0

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

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

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

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

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

Смежные вопросы