zoukankan      html  css  js  c++  java
  • 学习在dos下使用gcc来编译

    这两年里,断断续续的学习和使用c,平时都是在CodeBlocks里写代码,编译程序,点一下按钮就行了。对整个编译过程是一点儿都不了解。相比当年学习java,真的是选择了两个不同的路,当年学习java的时候,全是在dos下学习,javac, java,javaw之类的命令用的那些相当的熟,几年后才开始使用eclipse写代码。

    今天在找如何用CodeBlocks编译生成的exe文件添加版本信息时,发现一篇文章,里面介绍到在dos下使用gcc,我就按照上面的提示操作了一下,过程中没有遇到什么问题。

    只是感觉gcc命令用到的参数那是相当的多啊。

    1.Console命令行版本:
    文件名:main.c
    代码:

    程序代码:
    #include <stdio.h>

    int main()
    {
        printf("hello world ");
        return 0;
    }


    在命令行下面输入:
        gcc -Wall -c -g -o main.o main.c 进行文件编译。
    参数解释:
        -Wall 打开所有的编译警告
        -c 只时行编译,不进行链结。
        -g 产生调试信息。
        -o main.o 生成编译输出文件叫main.o
    最后进行文件链结:
        ld -Lc:mingwlib -o main.exe main.o c:mingwlibcrt2.o -lmingw32 -lkernel32 -lmsvcrt
    参数解释:
        -Lc:mingwlib 设置链结时库文件路径,不设置的话,-lmingw32这些参数会找不到的。
        -o main.exe 设置输出最终的可执行文件main.exe。
        c:mingwlibcrt2.o 这个是Windows系统的控制台程序初始化模块。
        -lmingw32 -lkernel32 -lmsvcrt 这三个是指示链结时链上libmingw32.a libkernel32.a libmsvcrt.a相关库。其中后两个对应的是kernel32.dll和msvcrt.dll,基本的程序代码printf函数实际上调用的是puts函数,在msvcrt.dll动态库中。
    当正式编译的时候,可以使用以下命令行以生成最小的EXE:
        gcc -s -O2 main.c -mconsole
    参数解释:
        -s 编译生成汇编代码
        -O2 进行目标代码优化,O1到O3范围
        -mconsole 指定生成控制台程序。
    虽然这里正式编译的示例没有上面步子那么多,但你依然需要如示例所示,明白一个程序倒底和哪些库/模块进行了链结。然后我们使用depends.exe查看程序与运行库依赖,如下图所示:

    2.Windows版本:
    文件名:main.c
    代码:

    程序代码:
    #include <windows.h>

    typedef HINSTANCE _h;
    int WINAPI WinMain(_h hinst, _h hprev, LPSTR cmd, int nShow)
    {
        return MessageBox(NULL, "hello world!", "OK", MB_OK);
    }

    命令行输入:
        gcc -c main.c
        ld -L"C:Program FilesCodeBlocksMinGWlib" main.o "C:Program FilesCodeBlocksMinGWlibcrt2.o" -lmingw32 -lkernel32 -luser32 -lmsvcrt
        这里示例的是如果是带空格的路径。

    当正式编译的时候,可以使用以下命令行以生成最小的EXE:注意-mwindows表示的是生成windows应用程序
        gcc -s -O2 main.c -mwindows
    用depends.exe查看程序与运行库依赖。用spy++查看窗口消息和信息。

    2012-09-15

  • 相关阅读:
    SVN Monitor工具推荐
    Linux Netbeans汉化不全
    PMWiki安装教程
    JIRA重启服务器后需要重启TOMCAT的解决
    SVN分支与合并
    WCF无法捕获FaultException
    非完美C++ Singleton实现[转载]
    C语言结构体的对齐原则
    C++ STL 学习笔记
    字符串笔试题
  • 原文地址:https://www.cnblogs.com/personnel/p/4584819.html
Copyright © 2011-2022 走看看