一 选项-o
1 点睛
选项-o用于指定要生成的结果文件,后面跟的就是结果文件名字。
o是output的意思,不是目标的意思。
结果文件可能是预处理文件、汇编文件、目标文件或者最终可执行文件。
2 示例
gcc -S test.i -o test.s
# -S 说明只进行到编译阶段
# 生成汇编文件test.s
3 示例
gcc -c test.cpp -o test
# 这个gest是目标文件,不是可执行文件,因为这里用到了-c,告诉gcc到汇编为止,不要进行链接。
gcc -c test.cpp -o test.o
# 这个test.o和test一样,都是目标文件
4 示例
gcc test.c -o test
# 生成可执行文件test
二 选项-c
1 点睛
选项-c告诉gcc对源文件进行编译会汇编,但不进行链接。此时,将生成目标文件,如果没有指定输出文件,就生成同名的.o文件。
2 示例
[root@localhost temp]# gcc -c test.cpp
[root@localhost temp]# ll
total 8
-rw-r--r--. 1 root root 188 Mar 10 11:00 test.cpp
-rw-r--r--. 1 root root 1504 Mar 10 11:00 test.o
# 生成了目标文件test.o
3 示例
[root@localhost temp]# gcc -c test.cpp -o test
# test是目标文件,而不是可执行文件,下面测试可证明,它和test.o内容相同
[root@localhost temp]# ls
test test.cpp test.o
[root@localhost temp]# ./test
-bash: ./test: Permission denied
[root@localhost temp]# chmod +x test
[root@localhost temp]# ./test
-bash: ./test: cannot execute binary file
[root@localhost temp]# md5sum test.o
3edeaa07cd496b92e1fd5c287de2131b test.o
[root@localhost temp]# md5sum test
3edeaa07cd496b92e1fd5c287de2131b test
4 -c后跟多源文件情况
当-c后跟多个源文件,会为每个源文件生成一个.o文件,但此时是不能使用-o的。
5 实战
test1.cpp内容
[root@localhost temp]# cat test1.cpp
#include <stdio.h>
int t1()
{
bool b=false; //如果文件命名为test.c就会报错,因为C语言没有bool类型
printf("hello, boy \n" );
return 0;
}
test2.cpp内容
[root@localhost temp]# cat test2.cpp
#include <stdio.h>
int t2()
{
bool b=false; //如果文件命名为test.c就会报错,因为C语言没有bool类型
printf("hello, boy \n" );
return 0;
}
进行-c编译和汇编
[root@localhost temp]# ll
total 12
-rw-r--r--. 1 root root 186 Mar 10 11:05 test1.cpp
-rw-r--r--. 1 root root 186 Mar 10 11:06 test2.cpp
-rw-r--r--. 1 root root 188 Mar 10 11:00 test.cpp
[root@localhost temp]# gcc -c test.cpp test1.cpp test2.cpp
[root@localhost temp]# ls
test1.cpp test1.o test2.cpp test2.o test.cpp test.o
# 可以看到,分别生成了3个.o文件
# -c 企图用-o,会报错
[root@localhost temp]# gcc -c test.cpp test1.cpp test2.cpp -o test.o
gcc: fatal error: cannot specify -o with -c, -S or -E with multiple files
compilation terminated.
# 如果直接生成可执行文件(不用-c),即使有多个源文件,-o也是可用的。
[root@localhost temp]# gcc test.cpp test1.cpp test2.cpp -o test
[root@localhost temp]# ls
test test1.cpp test1.o test2.cpp test2.o test.cpp test.o
[root@localhost temp]# ./test
hello, boy