参考内容
备忘:
${PROJECT_BINARY_DIR}指构建时的目录
../指上级目录
./指当前目录
对于如下结构的文件夹(假设inc内有头文件)
准备好所有cpp及对应头文件,创建CMakeLists.txt放在build目录下,编辑CMakeLists.txt
生成动态与静态库
如以下,第一行是编译所需最低版本,第二行是构建项目的名称
对于同一目录下的多个源文件,可用aux_source_directory制定该目录下所有文件到一个自定义的变量中,${PROJECT_BINARY_DIR}/../src指构建时的目录(build)的上级目录下的src文件夹,其下所有源文件都传递给变量SRC_LIST,后续使用${SRC_LIST}即可指代已整合的源文件
若头文件在其他路径下,可用include_directories自动查找头文件,输入参数为头文件所在文件夹路径,这里为${PROJECT_BINARY_DIR}/../inc
无论生成动态库还是静态库,都使用add_library实现,使用方法输入三个参数:库名称 动态or静态关键字 生成库所需源文件,关键字为SHARED与STATIC,分别对应动态.so文件与静态.a文件
设置最终生成库的名称可用set_target_properties,第一个参数为库名称,最后一个参数为新名称,一般会统一,方便最后链接到可执行文件
最后设置库默认生成的路径,可以指定库文件生成到你想要的位置,比如${PROJECT_BINARY_DIR}/../lib内
cmake_minimum_required (VERSION 2.8)
project (learn_cmake)
#整合目录内所有源文件至一变量 路径 源文件指代变量 ${PROJECT_BINARY_DIR}指cmake所在文件夹路径build
aux_source_directory(${PROJECT_BINARY_DIR}/../src SRC_LIST)
#添加头文件
include_directories(${PROJECT_BINARY_DIR}/../inc)
#添加动态静态库 生成库名称 动态or静态 生成所需源文件(变量指代)
add_library(hello_shared SHARED ${SRC_LIST})
add_library(hello_static STATIC ${SRC_LIST})
#设置最终生成库名称 一般统一动静态库
set_target_properties(hello_shared PROPERTIES OUTPUT_NAME "hello_lib")
set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello_lib")
#设置库默认生成位置路径 关键字 路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)
随后保存退出,在build目录下执行
cmake .
make
此时会发现,在lib目录下,出现了.a与.so库文件
链接库文件至可执行文件
删除或注释刚才CMakeLists.txt的所有内容,按以下内容重新编辑
前四行和刚才一样
第五行使用find_library查找库文件并传递给一变量,这里设置变量名为HELLO_LIB方便后续引用,寻找库文件名称为hello_lib(之前统一了动静态库名称),库文件所在目录是${PROJECT_BINARY_DIR}/../lib
稍后会生成二进制的可执行文件,在生成之前可以先指定其生成位置,这里选择放在bin文件夹下,即${PROJECT_BINARY_DIR}/../bin
现在使用add_executable生成可执行文件,参数:最终生成的可执行文件名称 所有源代码(用先前定义的源码变量指代)
使用target_link_libraries链接库到可执行文件,参数:已有可执行文件的名称 所有库文件(用先前定义的库文件变量指代)
cmake_minimum_required (VERSION 2.8)
project (learn_cmake)
aux_source_directory(${PROJECT_BINARY_DIR}/../src SRC_LIST)
include_directories(${PROJECT_BINARY_DIR}/../inc)
# 变量 查找库文件名称 库文件所在目录
find_library(HELLO_LIB hello_lib ${PROJECT_BINARY_DIR}/../lib)
#可执行文件生成路径 /build/../bin
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin)
#生成可执行文件
add_executable(hello ${SRC_LIST})
#链接库到可执行文件
target_link_libraries(hello ${HELLO_LIB})
随后保存退出,还是在build目录下执行
cmake .
make
此时会发现,在bin目录下,出现了hello可执行文件
运行可执行文件
./hello
将cpp源码移出工作文件夹后,程序依然可以运行