liunx下c语言的编译

来源:互联网 发布:网络公关公司找cyaa63 编辑:程序博客网 时间:2024/04/30 19:18
这篇文章只要介绍在linux下如何编译c语言,包括用命令编译c语言,使用makefile自动编译,以及如何使用cmake工具生成makefile文件。

在linux下用命令编译c语言

编译单个文件test.c的流程如下
touch testc.cvim testc.c #敲好代码保存退出gcc testc.c #会得到a.out文件./a.out #就能运行
如果要重命名编译好的文件,可以加入参数-o
gcc -o testc testc.c
多文件编译:
     如果我们有多个文件,比如:
     main.c
testFunc1.h
testFunc1.c
testFunc2.h
testFunc2.c
我们要编译它,可以这样子:
$ gcc -c main.c$ gcc -c testFunc1.c$ gcc -c testFunc2.c$ gcc -o main main.o testFunc1.o testFunc2.o
也可以把gcc的命令换成cc(实际上cc可以指定编译工具为gcc),-c是只编译不链接,把单个文件编译成中间文件.o,然后-o是把最后得到的文件重命名,最后一条命令就是链接中间文件生成可执行文件并把最后生成的可执行文件重命名为main。
关于cc的使用参数参考这篇文章点击打开链接

使用makefile实现自动编译

可以看到,上面这么编译c,如果有文件修改,要重新编译是很麻烦的。所以我们有了make工具,它能方便的帮助我们实现自动编译。
我们的规则是:
1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。
2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接目标程序。
3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,并链接目标程序。
只要我们的Makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动地根据当前文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

我们试着编写makefile文件来编译上面的c程序:
makefile文件的格式如下:     
<target>:<prerequisites>
[tab]<commands>
target是要生成的目标文件的名字(可以是多个文件的名字,中间用空格分隔),也有伪目标,就是某个操作的名字。比如下面文件中的PHONY:main clean表示main和clean是两条命令(伪目标),即使当前目录下存在main和clean文件也会执行。
prerequisites前置条件,通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置件不存在,或者有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。如果为空,说明不需要前置条件,命令会自动执行。
[tab]表示table键,可以用命令自己指定。
commands表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建"目标"的具体指令,它的运行结果通常就是生成目标文件。
在本例中,我们可以写出这样的makefile文件:

然后我们发现这样写有大量重复的代码,于是将其改写成:

这里我们使用了Makefile的三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:  
$@       目标文件   
$^         所有的依赖文件  
$<        第一个依赖文件 
还可以再简化,有一个Makefile的缺省规则 
    .c.o: 
 gcc -c $<
这个规则表示所有的 .o文件都是依赖与相应的.c文件的。例如mytool.o依赖于mytool.c,这样Makefile还可以变为:
.PHONY:main cleanmain:main.o testFunc1.o testFunc2.occ -o $@ $^.c.o: cc -c $<clean:       rm *.o main
关于详细的makefile文件的写法可以参考博客点击打开链接

使用cmake工具生成makefile文件

问题又来了,对于大型的工程,手写makefile还是太复杂,于是我们有了Cmake工具,Cmake工具就是更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。
cmake根据CMakeLists.txt文件(学名:组态档)去生成makefile。最后Cmakelist要自己手写,当然如果你有IDE,类似vs,可以帮你生成。
那么具体如何做呢?

安装cmake

   在官网www.cmake.org里下载cmake-3.6.1.tar.gz,然后在linux下解压到root用户的user文件夹下。
tar -zxvf cmake-3.6.1.tar.gz
     然后
cd cmake-3.6.1
     执行引导程序bootstrap,
./bootstrap
这时会报错
Error when bootstrapping CMake:  
Cannot find appropriate C compiler on this system.  
Please specify one using environment variable CC.  
See cmake_bootstrap.log for compilers attempted.  
这是因为你没有安装c语言的编译器,在联网情况下,执行
yum install gcc
输入两次y就好了。
     再次执行bootstrap,发现又报错了:
Error when bootstrapping CMake:  
Cannot find appropriate C++ compiler on this system.  
Please specify one using environment variable CXX.  
See cmake_bootstrap.log for compilers attempted.  
同样的是没有安装c++编译器
yum install gcc-c++
再次执行bootstrap,这次好了。
然后编译安装,执行
     gmake或者make
等待之后,执行
     gmake install或者make install
检查安装which cmake看结果就知道安装是否正确。

在windows下安装:直接在官网上下载.msi安装包,双击安装就好了(windows下使用cmake参考这篇文章点击打开链接)。
安装好之后就可以使用cmake了。

单个文件的使用

     我们先对hello.c生成makefile文件,来看看到底怎么使用cmake。
     先建立一个工程文件夹makeFileTest,然后在里面新建文件夹build,hello.c文件(里面写输出helloWorld的c程序),CMakeLists.txt,CMakeLists.txt内容如下:
cmake_minimum_required(VERSION 2.8)#cmake最低版本要求,低于2.8构建过程会终止  PROJECT(cmake_test)#设置工程名字  SET(SRC_LIST hello.c)#SRC_LIST = hello.cINCLUDE_DIRECTORIES(/usr/include/glib)#设置inlucde目录  MESSAGE(STATUS "This is BINARY dir "${HELLO_BINARY_DIR})#打印状态信息  MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})  ADD_EXECUTABLE(hello ${SRC_LIST})#将SRC_LIST保存的目录下的文件编译成可执行文件并命名为hello
然后进入build目录,输入cmake ..
执行成功后会出现makefile文件,执行make命令即可在build目录下看到可执行程序hello。
关于cmake的常用命令可以参考这篇博客点击打开链接
未完待续
1 0