现在的位置: 首页 > 综合 > 正文

欣喜的发现,超牛的MinGW

2013年09月01日 ⁄ 综合 ⁄ 共 1353字 ⁄ 字号 评论关闭
    最近在用WinGW(GCC的WINDOWS版本)调试跨平台的C/C++程序,在链接程序的过程中,两次写错了链接的文件,一次是将.a的后缀误写为.lib,第二次是将.a的后缀误写为.dll,当时没发现,等到一天的工作结束了,躺在床上才想起这个问题。
    为什么啊?链接的文件都写错了,链接应该不能通过的,为什么调试一天的程序都一切正常呢?难道MinGW可以与LIB文件和DLL文件直接链接?

    于是今天专门做了测试。令人欣喜,的确是这样的:MinGW在链接的时候,可以与.LIB文件链接,也可以与DLL文件链接。
   下面是我写的pthread链接的测试程序:
//main.cpp

#include <stdio.h>
#include <pthread.h>

void* _thread_t(void* param)
{
    printf("thread_ok/n");
    return NULL;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, NULL, _thread_t, NULL);
    pthread_join(tid, NULL);
    getchar();
    return 1;
}

    编译的命令如下:
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让我的心情如此振奋,中午要多吃一碗饭!
 

抱歉!评论已关闭.