读书人

看似gcc不给在静态链接库中导出WinMai

发布时间: 2012-09-24 13:49:42 作者: rapoo

貌似gcc不给在静态链接库中导出WinMain,VC却行
像通过把入口点封装到lib中,用以实现完全面向对象思想,想法很简单,就是在lib中写好WinMain,创建对象,初始化。
在VC6下编译连接正常,在gcc下编译成功,连接出错
假设两个模块,一个是lib,一个是exe,如果在lib中写WinMain,那么两边都能成功编译,但是连接出错:
C:/gcc/bin/../lib/gcc/mingw32/3.4.0/../../../libmingw32.a(main.o)(.text+0x97):ma
in.c: undefined reference to `WinMain@16'

如果两个都写WinMain,那么更神奇了,有时候能连接成功,入口点为exe中那个,有时候提示WinMain@16重复定义。。。

[解决办法]
WinMain只有-mwindows才会链接

再说你的版本也太低了,那时候实现都不全
[解决办法]
你看ld的实现就知道了

依据目标,入口是一定的,而且链接顺序是按照specs来

如果有变化,需要自定义--entry即可


VC比较傻瓜,都给你整好了,不需要额外操作
[解决办法]
前一段时间用Mingw-w64编译Qt5程序时遇到过类似问题。
解决方案是取消一个宏定义。
建议检查你编译WinMain的库,是否有类似的预处理。
[解决办法]

探讨

前一段时间用Mingw-w64编译Qt5程序时遇到过类似问题。
解决方案是取消一个宏定义。
建议检查你编译WinMain的库,是否有类似的预处理。

[解决办法]
探讨

引用:

前一段时间用Mingw-w64编译Qt5程序时遇到过类似问题。
解决方案是取消一个宏定义。
建议检查你编译WinMain的库,是否有类似的预处理。


哈?神奇了,项目没什么复杂代码喔

[解决办法]
恩,你给出例子我就知道什么意思了

这个怎么说呢,主要原因在VC和GCC的链接器实现的不同

VC的链接器可以循环链接,GCC的链接器(ld)默认只能单向链接

你的demo.o和libwinmain.o需要CRT的其他符号,等到找完,发现少了WinMain@16,因为这个在libwinmain.o里面,而这个又是在很靠前的位置。

那么解决方案就是利用ld的输出信息,在最后面添加libwinmain.o

你可以使用g++ demo.cpp libwinmain.cpp -Wl,-v 来输出ld的真实命令行

我这里给你个参考,以我的环境为例

g++ -c demo.cpp
g++ -c libwinmain.cpp

g++ demo.o libwinmain.o -Wl,-v 的输出为

C/C++ code
Using built-in specs.COLLECT_GCC=g++COLLECT_LTO_WRAPPER=f:/mysoft/programmingtools/compiler/mingw/bin/../libexec/gcc/i686-w64-mingw32/4.7.1/lto-wrapper.exeTarget: i686-w64-mingw32Configured with: ../gcc/configure --prefix=/mingw --host=i686-w64-mingw32 --build=i686-w64-mingw32 --target=i686-w64-mingw32 --with-arch=pentium4 --with-tune=core-avx-i --with-lto-plugin --with-host-libstdcxx=-lstdc++ --disable-bootstrap --disable-werror --enable-languages=c,c++,fortran --enable-libgomp --enable-threads=posix --enable-lto --with-system-zlib --disable-libstdcxx-debug --enable-version-specific-runtime-libs --enable-fully-dynamic-string --disable-libstdcxx-pch --enable-libstdcxx-time=yes --disable-sjlj-exceptions --with-dwarf2 --disable-symvers --enable-checking=release --enable-cxx-flags='-fno-function-sections -fno-data-sections' --enable-cloog-backend=isl --disable-shared --enable-static --disable-rpath --disable-cloog-version-check --enable-libquadmath-support --enable-libquadmath --disable-multilib --disable-nls --with-pkgversion=pcx32Thread model: posixgcc version 4.7.1 20120501 (prerelease) (pcx32) COMPILER_PATH=f:/mysoft/programmingtools/compiler/mingw/bin/../libexec/gcc/i686-w64-mingw32/4.7.1/;f:/mysoft/programmingtools/compiler/mingw/bin/../libexec/gcc/;f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../../i686-w64-mingw32/bin/LIBRARY_PATH=f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/;f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/;f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../../i686-w64-mingw32/lib/../lib/;f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../../lib/;f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../../i686-w64-mingw32/lib/;f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../COLLECT_GCC_OPTIONS='-v' '-mtune=core-avx-i' '-march=pentium4' f:/mysoft/programmingtools/compiler/mingw/bin/../libexec/gcc/i686-w64-mingw32/4.7.1/collect2.exe -m i386pe -Bdynamic f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../../i686-w64-mingw32/lib/../lib/crt2.o f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/crtbegin.o -Lf:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1 -Lf:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc -Lf:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../../i686-w64-mingw32/lib/../lib -Lf:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../../lib -Lf:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../../i686-w64-mingw32/lib -Lf:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../.. demo.o libwinmain.o -lstdc++ -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt f:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/crtend.of:/mysoft/programmingtools/compiler/mingw/bin/../lib/gcc/i686-w64-mingw32/4.7.1/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x3b): undefined reference to `_WinMain@16'collect2.exe: error: ld returned 1 exit status 


[解决办法]
插入代码没断行了,你可以复制下diff看看

读书人网 >C语言

热点推荐