基本命令
g++是linux下最常用的编译工具,是GNU的 C++编译器。C++的代码生成过程一般为四个步骤:
- 预处理
- 将预处理后文件转换为汇编语言
- 将汇编语言变为目标代码(一般为机器代码)
- 链接,生成可执行程序
下面通过示例演示完整步骤:
以boost库安装后使用为例,示例中的功能需要指定include目录,链接对应的lib库
#include <iostream>
// Boost测试程序
#include <boost/version.hpp>
#include <boost/config.hpp>
// 时间与日期
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian
int main()
{
std::cout << "版本号(数字):" << BOOST_VERSION << std::endl;
std::cout << "版本号(字符串):" << BOOST_LIB_VERSION << std::endl;
std::cout << "操作系统:" << BOOST_PLATFORM << std::endl;
std::cout << "编译器:" << BOOST_COMPILER << std::endl;
std::cout << "标准库:" << BOOST_STDLIB << std::endl;
std::cout << day_clock::local_day() << endl;
return 0;
}
- 预处理:
g++ -E -I /usr/local/include/ boost_test.cpp > pre.i
预处理命令参数为 -E 预处理会寻找头文件,因此需要-I 指定include路径信息,预处理的过程不会自动生成文件,通过输出重定向到了自定义的文件中,此处为pre.i,也可以生成未pre.txt类型,该文件可以直接查看内容
- 生成汇编文件,即预处理与编译过程
g++ -S -I /usr/local/include/ boost_test.cpp
g++ -S 完成了预处理和汇编的过程,未指定输出时,该过程会生成同名的汇编文件,即boost_test.s,该文件也可以通过vim打开直接查看内容,主要为汇编语句
- 生成目标代码
g++ -c boost_test.cpp -I /usr/local/include/
g++ -c 选项激活预处理,编译,和汇编,最后会生成同名的.o文件,该文件已经是机器代码,因此直接通过vim打开会出现乱码,想要查看生成的函数调用信息,可以通过nm命令查看,例如想要看看local_day()有没有生成,通过如下方法
nm boost_test.o |grep local_day
输出信息:
0000000000001910 T __ZN5boost9date_time9day_clockINS_9gregorian4dateEE13local_day_ymdEv
0000000000000d20 T __ZN5boost9date_time9day_clockINS_9gregorian4dateEE9local_dayEv
- 链接生成可执行文件
在实际工程项目比较少时,可以考虑一次生成
g++ boost_test.cpp -I /usr/local/include -L /usr/local/lib -lboost_date_time
-L编译选项指定了链接的库所在目录,-l则指定了链接的库名称,在linux下库文件名一般为lib开头,即libboost_data_time.a,链接时,去掉lib和.a即可。
由于我们已经生成了boost_test.o文件,因此可以直接通过链接多个.o文件生成可执行文件
g++ boost_test.o -L /usr/local/lib
系统默认生成的可执行文件名为a.out
执行该文件
./a.out
版本号(数字):106400
版本号(字符串):1_64
操作系统:Mac OS
编译器:Clang version 8.1.0 (clang-802.0.42)
标准库:libc++ version 3700
2017-Sep-19
可以看到文件生成成功,但是a.out文件名不便使用,而且容易被覆盖,可以通过
g++ boost_test.o -L /usr/local/lib -o boost_test
生成文件名为boost_test的文件(linux下文件名后缀不影响格式)
在之前的步骤中,均可用通过-o 指定输出文件名。
补充
g++ 的命令参数选项很多,具有很强大的编译功能,可以通过man g++查询或者通过官方文档了解深入,后续会继续介绍g++使用的常用选项和注意事项