cmake_minimum_required (VERSION 2.8) project (learn_cmake) add_executable(hello hello.cpp) 此时在当前目录新增两个依赖,并mian函数的执行需要依赖这两个文件
add.cpp
add.h
只需要在CMakeLists.txt中添加所依赖的.cpp文件,编译步骤和上面相同。
cmake_minimum_required (VERSION 2.8) project (learn_cmake) add_executable(hello hello.cpp myadd.cpp)
如果同一目录下有无穷多源文件,那么一个一个添加就很慢了。此时可以使用cmake中的函数存储这些源文件
aux_source_directory(dir var)
他的作用是把dir目录中的所有源文件都储存在var变量中
然后需要用到源文件的地方用 变量var来取代
此时 CMakeLists.txt 可以这样优化
cmake_minimum_required(VERSION 2.8) project(learn_cmake) aux_source_directory(. SRC_LIST) add_executable(hello ${SRC_LIST}) 对于集中的头文件,CMake提供了一个很方便的函数
include_directories ( dir )
他的作用是 自动去dir目录下寻找头文件,相当于 gcc中的 gcc -I dir
此时 CMakeLists.txt 可以这样优化
cmake_minimum_required(VERSION 2.8) project(learn_cmake) aux_source_directory(. SRC_LIST) include_directories(./inc_dir) add_executable(hello ${SRC_LIST}) 假如说当前的工程目录是这样的,头文件和源文件分离,并含有多个文件夹

此时 CMakeLists.txt 可以这样优化
cmake_minimum_required(VERSION 2.8) project(learn_cmake) aux_source_directory(src_dir1 SRC_LIST1) aux_source_directory(src_dir2 SRC_LIST2) aux_source_directory(main_dir MAIN_DIR) include_directories(./inc_dir1 ./inc_dir2) add_executable(hello ${SRC_LIST1} ${SRC_LIST2} ${MAIN_DIR}) 假如说当前的项目目录是这样的

此时 CMakeLists.txt 可以这样优化
cmake_minimum_required(VERSION 2.8) project(learn_lib) #整合源文件 aux_source_directory(${PROJECT_BINARY_DIR}/../src SRC_LIST) #引入头文件路径 include_directories(${PROJECT_BINARY_DIR}/../inc) #生成静态库或者动态库 参数1:生成的库的名称 参数2:静态或动态 参数3:生成库所需要的源文件 add_library(func_shared SHARED ${SRC_LIST}) add_library(func_static STATIC ${SRC_LIST}) #设置最终生成的库的名称 set_target_properties(func_shared PROPERTIES OUTPUT_NAME "myfunc") set_target_properties(func_static PROPERTIES OUTPUT_NAME "myfunc") #设置生成的库的路径 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib) 开始编译:
出现库文件就算编译成功
库文件目录结构如下:
此时 CMakeLists.txt 可以这样写
cmake_minimum_required(VERSION 2.8) project(learn_lib) #整合源文件 aux_source_directory(${PROJECT_BINARY_DIR}/../main_src MAIN_SRC) #引入头文件路径 include_directories(${PROJECT_BINARY_DIR}/../inc) #生成静态库或者动态库 参数1:生成的库的名称 参数2:静态或动态 参数3:生成库所需要的源文件 add_library(func_shared SHARED ${SRC_LIST}) add_library(func_static STATIC ${SRC_LIST}) #设置最终生成的库的名称 set_target_properties(func_shared PROPERTIES OUTPUT_NAME "myfunc") set_target_properties(func_static PROPERTIES OUTPUT_NAME "myfunc") #设置生成的库的路径 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib) #查找库文件 第一个参数:存储查找到的库文件 第二个参数:要查找的库文件 第三个参数:要查找的目录 find_library(FUNC_LIB myfunc ${PROJECT_BINARY_DIR}/../lib) #设置可执行文件生成到哪里 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin) add_executable(hello ${MAIN_SRC}) target_link_libraries(hello ${FUNC_LIB}) 选择生成动态库(Dynamic Link Library,DLL 在 Windows 上,Shared Object,.so 在 Unix/Linux 上,或 Dynamic Library,.dylib 在 macOS 上)还是静态库(Library Archive,.a 或 .lib)主要取决于以下几个因素: