为什么啊?链接的文件都写错了,链接应该不能通过的,为什么调试一天的程序都一切正常呢?难道MinGW可以与LIB文件和DLL文件直接链接?
于是今天专门做了测试。令人欣喜,的确是这样的:MinGW在链接的时候,可以与.LIB文件链接,也可以与DLL文件链接。
下面是我写的pthread链接的测试程序:
//main.cpp
#include <stdio.h> #include <pthread.h> void* _thread_t(void* param) int main() |
编译的命令如下:
g++ -o main.o -c main.cpp -g -Wall -I"e:/pthread_wiin32/include"
下面使用GCC的.a格式的文件进行链接:
g++ -o main.exe main.o "e:/pthread_win32/lib/libpthreadGC2.a"
以上的链接办法当然能链接通过。
下面尝试和windows特有的.lib格式的文件进行链接:
g++ -o main.exe main.o "e:/pthread_win32/lib/pthreadVC2.lib"
欣喜若狂,泪流满面————链接通过了。执行程序,一切正常!!!
下面再试和DLL链接:
g++ -o main.exe main.o "e:/pthread_win32/lib/pthreadVC2.dll"
又链接通过,又执行正常!!!高兴得都不知道说啥好了!!!
MinGW真是超牛啊!内部应该提供了从lib文件和从dll文件获得类型信息的功能!!!由此看来,GCC链接obj文件应该也是可以的。
不过,总还是有些遗憾。不是为MinGW遗憾,为微软而遗憾:我使用VC8.0(VS2005)编译的obj和LIB文件无法被MinGW链接,能够被MinGW链接的lib文件应该是由版本较早的VC编译器生成的。可惜,我电脑里面没装VC6,没办法测试。有兴趣的朋友如果测试了,希望能告知我结果。
伟大的开源社区,令人欣喜的GCC,如此兼容并包的功能实在让我们感动。恶心的微软,随着新版的编译器的退出,他们一定修改了obj和lib文件的原有格式,使得GCC无法获得类型信息,如此的小见如此的自私。
以前在WINDOWS下写OCI和PROC的程序,发现ORACLE的库中没有提供.a格式的链接文件,于是暗暗把ORACLE骂了一顿。而今,发现MinGW可以和lib格式的库链接,姑且就原谅ORACLE了。
呵呵,GCC让我的心情如此振奋,中午要多吃一碗饭!