12.C++编译相关
C++的编译过程分为三步:预处理->编译->链接
链接是将多个目标文件(.o)和库文件合成最终的可执行文件
动态链接-在运行期间通过动态链接器加载.so/.dll库 程序中只存在函数符号的引用 而非实际的代码
静态链接-在编译期间将.a库中的代码 直接打包到可执行文件 不依赖外部库可独立运行
linux下的编译
一般用gcc编译c代码,用g++编译C++代码
1.预处理 (.i文件)处理头文件,宏定义等
g++ -E test.cpp -o test.i -E是仅预处理 指定源文件 -o test.i是指定输出文件名 后面也一样
2.编译 (.s文件)
g++ -s test.i -o test.s
3.汇编 (.o文件)
g++ -c test.s -o test.o
4.链接 (bin文件)
g++ temp.o -o test
以上4步可以用一条指令完成
g++ test.cpp -o test
-g 产生带调试信息的可执行文件 否则GDB无法调试
-o[n]优化代码 如 -o1 -o2 可以提高执行速度
time ./test 可以查看执行耗时
-wall 打印警告信息 -w关闭警告信息
-std=c++11 设置编译标准
-D定义宏 g++ -DABC main.cpp main.cpp中可以写#ifdef ABC ...#endif
链接库
一、库在 /lib 或 /usr/lib 或 /usr/local/lib
用-l紧接库名
二、库不在上述路径
用大写L+目录 再用-l接库名
静态库编译
1.g++将.cpp编译成.o g++ -c xxx.cpp
2.打包编译 ar res libxxx.a xxx.o
3.使用 g++ main.cpp -L. -lxxx -o app
4.执行 ./cpp
动态库编译
g++ -fpic -c math.cpp
g++ -shared -o libmath.so math.o
g++ main.cpp -L. -lmath -o app
export LD_LIBRARY_PATH=. 告诉动态库位置
指定头文件搜索目录 -I
g++ -I/myinclude test.cpp
CMake
基本格式 指令(参数1 参数2...)
参数使用括弧括起来
参数之间用空格或分号分开
指令大小写无关 参数、变量大小写相关
变量用${变量名}取值 IF中直接用变量名取值
重要指令
cmake_minimum_required(VERSION 2.8.3) 指定cmake最小版本要求
project(HELLOWORLD) 指定工程名称
set(SRC a.cpp b.cpp) 显式定义变量SRC的值为 a.cpp b.cpp
include_directories(/usr/include ./include) 向工程添加多个头文件搜索路径 相当于g++的-I
link_directories(/usr/lib ./lib) 向工程添加多个库文件搜索路径 相当于g++的-L
add_library(hello SHARED ${SRC}) 生成库文件 参数 库名 动态库.so
add_compile_options(-wall -std=c++11 -o2) 添加编译参数
add_executable(main main.cpp) 生成可执行文件
target_link_libraries(main hello) 为工程添加需要链接的库 相当于g++的-l参数 可执行文件 库名
add_subdirectory(src) 向当前工程添加存放源文件的子目录(目录中要有cmakelists.txt)并可以指定中间二进制和目标二进制存放的位置
aux_suorce_directory(. src) 发现一个目录下的所有源代码 并存储在一个变量中
常用变量
CMAKE_C_FLAGS gcc编译选项
CMAKE_CXX_FLAGS g++编译选项
CMAKE_BUILD_TYPE 编译类型(Debug Release)
cmake编译工程
主目录需要存在一个cmakelists.txt
两种规则
1.包含源文件的子文件夹有cmakelists.txt文件 主目录的cmakelists.txt通过add_subdirectory添加子目录
2.包含源码的子文件夹没有cmakelists.txt子目录编译规则体现在子目录中
编译过程
1.手动编写cmakelists.txt
2.执行cmake命令生成Makefile
3.执行make命令进行编译
. ./当前目录 .. ../上级目录
内部构建 (不推荐使用)
在顶层目录下 cmake. make 文件会生成在顶层目录下
外部构建 编译会输出到build文件夹中
mkdir build
cd build
cmake ..
make
更多推荐


所有评论(0)