cmake的两个有用的方向:
- 通过cmake + clangd来看源码
- 生成依赖图
一、g++的编译选项
- -L 指定库文件(libXXX.a,libXXX.so)的目录
- -I 指定头文件.h的目录
- -l 指定要链接的库名XXX
二、动态链接器的查找路径
- rpath
- .bashrc中的系统变量
- 系统目录 /usr/lib/ 和 usr/local/lib
- ld.so.cache动态库缓存
三、CMakeLists.txt的一个Linux下的范例
cmake_minimum_required(VERSION 3.20)
# 相当于VS的.sln
project(demo)
#set(SRC add.cpp sub.cpp mul.cpp div.cpp main.cpp) 设置变量SRC
# 到src/目录中查找*.cpp文件,然后把文件列表存入变量SRC
aux_source_directory("${CMAKE_CURRENT_SOURCE_DIR}/src" SRC)
# 到include/目录中查找*.h文件,然后把文件列表存入变量INC
file(GLOB INC "${CMAKE_CURRENT_SOURCE_DIR}/src/include/*.h")
# 输出变量的内容
message(${PROJECT_BINARY_DIR}) # build/
# 生成静态库,同时创建目标demo
#add_library(demo STATIC ${SRC})
# 生成动态库,同时创建目标demo
add_library(demo SHARED ${SRC})
# 指定输出库的目录
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
# 指定输出可执行文件的目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
# -I 指定头文件.h的目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
# -L 指定库文件(libXXX.a,libXXX.so)的目录
link_directories(${PROJECT_BINARY_DIR}/lib)
# 链接静态库,-l 指定要链接的库名calc
#link_libraries(calc)
# 相当于VS的.vcproj:生成可执行文件,同时创建目标demo
add_executable(demo ${SRC} ${INC})
# -I 指定头文件.h的目录
#target_include_directories(demo PUBLIC ${PROJECT_BINARY_DIR}/include)
# 链接动态库,-l 指定要链接的库名calc
# 可以链接动态库,也可以连接静态库,但优先链接动态库。
target_link_libraries(demo calc)
这里注意:target(demo)必须是由函数指令创建的——例如通过 add_executable() 或者 add_library()创建——不能是 Alias Targets 别名目标。所以,CMakeLists.txt中函数指令的使用顺序是有讲究的(针对target目标的使用)。
相应的cmake基本命令如下:
cmake -S . -B build/
cmake --build build/
# build/是默认的可执行程序输出目录
cd build/
./demo