十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
进入终端,用cd 命令切换到c文件的目录
临西ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
编译命令:gcc -o exec_file (可执行文件名) soucre_file.c(源文件)
然后 用命令 ./exec_file 运行
更高级的是用make 工具,自动编译
新建一个sort.c文件,写一个最简单的排序
使用 gcc -o libsort.so -fPIC -shared sort.c 产生libsort.so库。
.so库有两种调用方法:
新建main.c文件:
使用命令 gcc -o main main.c -lsort -L. 编译。
新建main2.c文件:
使用命令 gcc -o main2 main2.c -ldl 编译。动态加载.so库的话需要-ldl。
运行./main2后输出递增序列,调用成功。
请慢慢看,真要详细讲起来,文字实在太多了,但是由于时间原因,我只能以粗略的文字讲,语言有一些逻辑漏洞,请见谅。
首先我会以粗略的文字回答你的其中一个问题,然后后面会给出第二个问题的答案。
问:什么时候会执行这些规则及其相对应的命令?
答:当你给make命令指定了它要生成的终极目标时,它会从要生成的终极目标寻址依赖的依赖条件,然后依赖条件一级一级的查找并执行相对应的命令。即如果当有目标需要.s、.o这些依赖条件的时候,会取找要生成.s、.o目标的依赖条件,这个时候就会执行这些规则:
.S.s:
$(CPP) $(CFLAGS) $ -o $*.s
.S.o:
$(CC) $(CFLAGS) -c $ -o $*.o
.c.o:
$(CC) $(CFLAGS) -c $ -o $*.o
一、
源代码文件必须经过:预处理(cpp)、编译(ccl)、汇编(as)、链接(ld)。这四个阶段最终才得到可执行的程序:
makefile里定义了变量CPP=cpp;其中$(CPP)的意思是去定义变量CPP里的值:cpp,用cpp来预处理源文件。
$(CFLAGS)的意思是取定义变量CDLAGS里面的值,一般是一些自我定义的预处理命令和编译命令的参数。
$的意思是:在规则的命令中,表示第一个依赖条件
-o是一个预处理、编译等执行命令需要的参数
/*
其实这条命令:$(CPP) $(CFLAGS) $ -o $*.s,就是一条预处理命令,将一个源文件预处理为.s文件后缀的文件,*为通配符。那源文件在哪里呢。其实这条命令.S.s: 已经说了以.S结尾的文件就是源文件。那这条命令.S.s这么说了呢?请看下面的后缀规则讲解。
*/
二、
老式风格的"后缀规则"
后缀规则是一个比较老式的定义隐含规则的方法。后缀规则会被模式规则逐步地取代。因为模式规则更强更清晰。为了和老版本的Makefile兼容,GNU make同样兼容于这些东西。后缀规则有两种方式:"双后缀"和"单后缀"。
双后缀规则定义了一对后缀:目标文件的后缀和依赖目标(源文件)的后缀。如".c.o"相当于"%o : %c"。单后缀规则只定义一个后缀,也就是源文件的后缀。
后缀规则中所定义的后缀应该是make所认识的,如果一个后缀是make所认识的,那么这个规则就是单后缀规则,而如果两个连在一起的后缀都被make所认识,那就是双后缀规则。例如:".c"和".o"都是make所知道。
因而,如果你定义了一个规则是".c.o"那么其就是双后缀规则,意义就是".c" 是源文件的后缀,".o"是目标文件的后缀。如下示例:
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $
其中.c.o:这个命令表示源文件的后缀为.c,目标文件的后缀为.o;即也可理解为:生成.o的目标文件依赖条件是源文件.c
下面命令是将是所有的.c源文件都编译成.o的目标文件。
注:后缀规则不允许任何的依赖文件,如果有依赖文件的话,那就不是后缀规则,那些后缀统统被认为是文件名,
如:
.c.o: foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $
这个例子,就是说,文件".c.o"依赖于文件"foo.h",而不是我们想要的这样:
%.o: %.c foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $
因此后缀规则不允许任何的依赖文件。
一般是缺少相应的头文件,新建项目时 选择console application,不要选MFC的那种项目。
主函数应该写成int main(),你写成mian了。
链接时缺少相关的库文件(.a/.so)
在此,只举个静态库的例子,假设源码如下。
先把test.c编译成静态库(.a)文件
gcc -c test.c
ar -rc test.a test.o
至此,我们得到了test.a文件。我们开始编译main.c
gcc -c main.c
这时,则生成了main.o文件,然后我们再通过如下命令进行链接希望得到可执行程序。
gcc -o main main.o
你会发现,编译器报错了:
/tmp/ccCPA13l.o: In function `main':
main.c:(.text+0x7): undefined reference to `test'
collect2: ld returned 1 exit status
其根本原因也是找不到test()函数的实现文件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个库,链接命令修改为如下形式即可。
gcc -o main main.o ./test.a //注:./ 是给出了test.a的路径
【扩展】:同样,为了把问题说清楚,上面我们把代码的编译链接分开了,如果希望一次性生成可执行程序,则可以对main.c和test.a执行如下命令。
gcc -o main main.c ./test.a //同样,如果不加test.a也会报错。
格式 gcc [option] [sourcefilename]
介绍一些常用的选项:最简单的是:gcc hello.c
默认的情况下将生成a.out的可执行性文件,你只需要在终端上输入./a.out就可以看到执行的结果.
如果你想指定生成目标文件的名字那么你可以加上 -o选项,命令如下:
gcc -o hello hello.c
命令如下:
gcc -c hello hello.c
在Linux下面,如果要编译一个C语言源程序,我们要使用gcc编译器。
先将源文件编译成目标文件:gcc - c hello.c
生成hello.o文件,再将目标文件编译成可执行文件:gcc -o hello hello.o
如:
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
扩展资料:
在使用GCC编译器的时候,我们必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,这里只介绍其中最基本、最常用的参数。具体可参考GCC Manual。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是编译器所需要的参数,filenames给出相关的文件名称。
参考资料:
百度百科_gcc