C++的编译过程
使用g++等编译工具,从源码生成最终的可执行文件一般有这几步:预处理(Preprocess)、编译(Compile)、汇编(assemble)、链接(link)
生成静态库并链接
附件位置:4.static_lib_test
A.生成静态库链接
cpp
#account_dir/CMakeLists.txt
# 最低版本要求
cmake_minimum_required(VERSION 3.10)
# 项目信息
project(Account)
# 添加静态库,Linux下会生成libAccount.a
add_library(Account STATIC Account.cpp Account.h)
进行编译
cpp
cmake -S . -B build
cmake --build build/
进入account_dir进行编译,创建爱连接库:libAccount.a文件
# 编译静态库后,会在build下生成 build/libAccount.a 静态库文件
account_dir/
├── Account.cpp
├── Account.h
├── build
│ └── libAccount.a
└── CMakeLists.txt
这里我们用到add_library, 和add_executable一样,Account为最终生成的库文件名(lib库名称.a),第二个参数是用于指定链接库为动态链接库(SHARED)还是静态链接库(STATIC),后面的参数是需要用到的源文件。
B.生成静态库链接
cpp
# test_account/CMakeLists.txt
# 最低版本要求
cmake_minimum_required(VERSION 3.10)
# 项目名称
project(test_account)
# 添加执行文件
add_executable(test_account test_account.cpp)
# 添加头文件目录,如果不添加,找不到头文件
target_include_directories(test_account PUBLIC "../account_dir")
# 添加库文件目录,如果不添加,找不到库文件
target_link_directories(test_account PUBLIC "../account_dir/build")
# 添加目标链接库
target_link_libraries(test_account PRIVATE Account)
cpp
cmake -S . -B build
cmake --build build/
# 编译后目录如下
4.static_lib_test/
├── account_dir
│ ├── Account.cpp
│ ├── Account.h
│ ├── build
│ │ └── libAccount.a
│ └── CMakeLists.txt
└── test_account
├── build
│ └── test_account
├── CMakeLists.txt
└── test_account.cpp
我们通过add_library和add_executable定义了Target,我们可以通过Target的名称为其添加属性,例如:
cpp
# 指定目标包含的头文件目录
target_include_directories(test_account PUBLIC "../account_dir")
# 添加库文件目录,如果不添加,找不到库文件
target_link_directories(test_account PUBLIC "../account_dir/build")
# 指定目标链接的库
target_link_libraries(test_account PRIVATE Account)
通过target_include_directories,我们给test_account添加了头文件引用路径".../account_dir"。上面的关键词PUBLIC,PRIVATE用于说明目标属性的作用范围,更多介绍参考下节。
通过target_link_libraries,将前面生成的静态库libAccount.a链接给对象test_account,但此时还没指定库文件的目录,CMake无法定位库文件
再通过target_link_directories,添加库文件的目录即可。
生成动态库并连接:SHARED
A.生成动态库链接,生成libAccount.so
cpp
#account_dir/CMakeLists.txt
# 添加动态库,Linux下会生成libAccount.so
add_library(Account SHARED Account.cpp Account.h)
进行编译
cpp
cmake -S . -B build
cmake --build build/
编译动态库后,会在build下生成 build/libAccount.so 动态库文件
account_dir/
├── Account.cpp
├── Account.h
├── build
│ └── libAccount.so
└── CMakeLists.txt
B.生成动态库链接
操作不变。
cpp
# ldd查看依赖的动态库
libAccount.so => /home/enpei/Documents/course_cpp_tensorrt/course_5/src/5.dynamic_lib_test/test_account/../account_dir/build/libAccount.so (0x00007fb692cf1000)
当然,也可以用一个CMakeLists.txt来一次性编译,参考附件6.build_together
cpp
#build_together/CMakeLists.txt`
# 最低版本要求
cmake_minimum_required(VERSION 3.10)
# 项目信息
project(test_account)
# 添加动态库
add_library(Account SHARED "./account_dir/Account.cpp" "./account_dir/Account.h")
# 添加可执行文件
add_executable(test_account "./test_account/test_account.cpp")
# 添加头文件
target_include_directories(test_account PUBLIC "./account_dir")
# 添加链接库
target_link_libraries(test_account Account)
进行编译
cpp
cmake -S . -B build
cmake --build build/
测试
cpp
./build/test_account