案例1:无静态库、动态库参与
文件目录结构1
假设include目录存放头文件data.h包含函数声明,src目录存放对应的data.cpp文件包含函数定义、以及一个全局变量。main.cpp存放在文件根目录、包含main函数入口。
代码内容
常规编译指令
g++ main.cpp src/data.cpp -Iinclude -o main
Cmake构建
新建CMakeList.txt文件,填写以下4行内容:
cmake_minimum_required(VERSION 3.5)
project (hello_cmake1)
include_directories(include/) # 与g++ 命令的 -Iinclude 参数等价
add_executable(main main.cpp src/data.cpp) # g++ main.cpp src/data.cpp -o main
效果:
案例2:静态链接库参与
原来三个文件的代码不变。
首先看常规的基于g++ 编译生成静态链接库的命令:
cd src
g++ data.cpp -c -I../include # 汇编,生成data.o文件
ar rs libdata.a data.o # 生成静态库 libdata.a
cd ..
g++ main.cpp -Iinclude -Lsrc -ldata -o static_main # 链接,生成可执行文件static_main
Cmake构建
新建CMakeList.txt文件,填写以下内容:
cmake_minimum_required(VERSION 3.5)
project (hello_cmake2)
# 生成静态链接库
add_library(Data STATIC src/data.cpp)
target_include_directories(Data PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 生成可执行文件
add_executable(static_main main.cpp)
# 链接静态/共享 库文件
target_link_libraries(static_main PUBLIC Data)
效果:
案例3:动态链接库参与
原来三个文件的代码不变。
首先看常规的基于g++ 编译生成动态链接库的命令:
cd src
g++ data.cpp -I../include -fPIC -shared -o libdata.so
# 上一条等价于下面两条:
# g ++ data.cpp -I../include -c -fPIC 汇编,生成data.o文件
# g++ -shared -o libdata.so data.o 生成动态库 libdata.so
cd ..
g++ main.cpp -Iinclude -Lsrc -ldata -o share_main # 链接,生成可执行文件static_main
Cmake构建
cmake_minimum_required(VERSION 3.5)
project (hello_cmake3)
# 生成动态链接库
add_library(Data2 SHARED src/data.cpp)
target_include_directories(Data2 PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 添加编译参数
add_compile_options(-w -std=c++11 -O2)
# 生成可执行文件
add_executable(share_main main.cpp)
# 链接静态/共享 库文件
target_link_libraries(share_main PUBLIC Data2)
效果: