用MinGW 3.4.5 编译出4.3.5 opensource版静态lib,codeblocks 8.02中建立一个默认的qt工程,把默认的链接库QtCore4和QtGui4分别更名为QtCore和QtGui(之前编译生成的静态库的命名都不带'4',而动态的版本却是带有的?!),但是链接时报了一大堆错误:
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN12QApplicationC1ERiPPci'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN7QString16fromAscii_helperEPKci'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN11QPushButtonC1ERK7QStringP7QWidget'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN7QWidget6resizeERK5QSize'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN5QFontC1ERK7QStringiib'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN7QWidget7setFontERK5QFont'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN5QFontD1Ev'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN12QApplication4execEv'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN11QPushButtonD1Ev'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN12QApplicationD1Ev'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN7QString4freeEPNS_4DataE'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN7QString4freeEPNS_4DataE'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN12QApplicationD1Ev'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN11QPushButtonD1Ev'|
obj\Release\main.o:main.cpp|| undefined reference to `_imp___ZN5QFontD1Ev'|
obj\Release\main.o:main.cpp:(.text$_ZN7QStringD1Ev[__ZN7QStringD1Ev]+0x26)||undefined reference to `_imp___ZN7QString4freeEPNS_4DataE'|
||=== Build finished: 17 errors, 0 warnings ===|
用objdump工具查看生成的obj,发现里面的符号都是 “__imp___ZN12QApplicationC1ERiPPci”这样的形式,但是我编译出来的静态库中的符号却是 “___ZN12QApplicationC1ERiPPci” 的形式,而qt官方提供的动态lib中的符号也和obj文件一样是增加了 "__imp__" 前缀的形式,所以链接到自己编译的静态lib中就会出现找不到符号的问题。
http://www.qtcn.org/bbs/read.php?tid=17721 一文中也提到了这个问题,但是我使用suntongo 提出的修改LFLAGS方法并不管用,生成的obj文件依然采用了第二种形式的符号,这个问题困扰很久了,有人知道怎么解决么?
PS: VC编译出的Qt静态库就没有这个问题,而在codeblocks中使用vlc官方提供的静态qt库(
ftp://ftp.videolan.org/pub/videolan/vlc/0.8.5/contrib)时也还是会报找不到符号的错误