说在前面
- 操作系统:WSL ubuntu16
- cmake版本:3.16.3
场景
- 在处理一些老项目的时候,目录结构可能不是特别适合使用
cmake
,例如下面这种 - 目录结构
. ├── CMakeLists.txt ├── calc │ ├── CMakeLists.txt │ ├── common │ │ └── common.h │ ├── main.cpp │ └── multi │ ├── multi.cpp │ └── multi.h └── math ├── CMakeLists.txt ├── add │ ├── add.cpp │ └── add.h ├── common │ └── common.h ├── math.cpp └── math.h
- 代码地址
here github - 结构说明
math
是一个独立库,没有其他依赖;该库有一个common/common.h
头文件
calc
是一个依赖math
的库,该库有也有一个common/common.h
头文件;并且该目录下有一个main
文件,main
文件调用calc
首次尝试
-
最开始的
cmake
文件是类似这样的:# 最外层CMakeLists.txt cmake_minimum_required(VERSION 3.2) project(calc) set(CMAKE_BUILD_TYPE "RELEASE") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") # 设置编译后库文件目录 set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) # 设置可执行文件目录 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 包含头文件目录 include_directories(math) include_directories(calc) # 包含子目录 子目录下必须有CMakeLists.txt add_subdirectory(math) add_subdirectory(calc) # 链接库目录 link_directories(${PROJECT_SOURCE_DIR}/lib) # 添加编译可执行文件 add_executable(Calc ${PROJECT_SOURCE_DIR}/calc/main.cpp) # 链接库文件 target_link_libraries(Calc math calc)
# math目录、calc目录下都是类似下面这种 project(math) # 递归遍历该目录(math)下所有 .cpp .c 文件 file(GLOB_RECURSE c_files *.cpp *.c) # 添加静态库math add_library(math STATIC ${c_files}) # 设置静态库文件名 set_target_properties(math PROPERTIES OUTPUT_NAME "math")
-
这种方式会导致在编译第二个库(这里是
calc
)时找不到common.h
,应为头文件添加了#ifndef __COMMON_H__ #define __COMMON_H__ #endif
导致
make
的时候第二个库报错:
修正
-
方法是在编译静态库的时候使用当前目录下的头文件
target_include_directories
:在编译目标的时候指定包含目录;
CMAKE_CURRENT_SOURCE_DIR
:当前处理的原始路径cmake_minimum_required(VERSION 3.2) project(calc) set(CMAKE_BUILD_TYPE "RELEASE") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) add_subdirectory(math) add_subdirectory(calc) link_directories(${PROJECT_SOURCE_DIR}/lib) add_executable(Calc ${PROJECT_SOURCE_DIR}/calc/main.cpp) target_link_directories(Calc PRIVATE ${PROJECT_SOURCE_DIR}/calc PRIVATE ${PROJECT_SOURCE_DIR}/math) target_link_libraries(Calc math calc)
project(math) file(GLOB_RECURSE c_files *.cpp *.c) add_library(math STATIC ${c_files}) target_include_directories(math PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set_target_properties(math PROPERTIES OUTPUT_NAME "math")
-
代码
here github