本文学习总结一下linux环境下命令行编译c++程序的内容,方便日后作为笔记来回顾。
安装好linux发行版后,默认会安装g++编译器。
- 单个源文件生成可执行程序
g++ helloworld.cpp
./a.out
编译器默认的动作:编译源代码文件生成对象文件(object file),链接对象文件和 libstdc++ 库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。
g++ helloworld.cpp -o helloworld
./helloworld
更普遍的做法是通过 -o 选项指定可执行程序的文件名。
程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。
gcc helloworld.cpp -lstdc++ -o helloworld
选项 -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libstdc++.a。
- 多个源文件生成可执行程序
如果多于一个的源码文件在 g++ 命令中指定,它们都将被编译并被链接成一个单一的可执行文件。
g++ *.cpp -o hello
如果cpp源文件较少,可以一一列出,如果很多,可以使用通配符*.cpp代替。
当然,也可以分别将cpp源文件先编译成目标文件.o,再链接成最终可执行文件。
1 g++ -c hello.cpp -o hello.o 2 g++ -c world.cpp -o world.o 3 g++ hsello.o world.o -o helloworld
选项 -E 使 g++ 将源代码用编译预处理器处理后不再执行其他动作。
选项 -S 指示编译器将程序编译成汇编语言,输出汇编语言代码而后结束,生成的汇编语言依赖于编译器的目标平台。
于是,完整的编译过程:
1 g++ -E hello.cpp -o hello.i // 预处理 2 g++ -S hello.i -o hello.s // 转化为汇编文件 3 g++ -c hello.s -o hello.o // 汇编文件->目标文件 4 g++ hello.o -o hello // 链接
- 创建静态库
静态库是编译器生成的一系列对象文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。库中的成员包括普通函数,类定义,类的对象实例等等。静态库的另一个名字叫归档文件(archive),管理这种归档文件的工具叫 ar 。
1 g++ -c sayhello.cpp 2 g++ -c sayworld.cpp 3 ar -r libsay.a sayhello.o sayworld.o
程序 ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入。
采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。
静态库使用:
g++ saymain.cpp libsay.a -o saymain
- 创建动态库
在静态库的基础上,加上-fPIC -shared即可。
gcc -fPIC -shared -o libfunc.so *.cpp
- include路径和link路径
-L(大写L)
用到的函数或操作非标准库下的,需要将库存在的地址用-L包含,库文件一般为.a或.so文件。
编译程序按照-L指定的路进去寻找库文件,一般的在-L的后面可以一次用-l指定多个库文件。
-l(小写L)
用在-L之后,后加库名称,-l库名(.a文件名)
-I(大写i)
包含include路径,编译程序按照-I指定的路进去搜索头文件。
参考:https://www.cnblogs.com/zhangkele/p/10043207.html