1. 说明
当一个工程编译后包含多个可执行和库文件,将这些文件分别放置在对应的目录里面会使得工程看起来更有序…(当然,这些都是我编的,毕竟要给自己找个理由)
这篇笔记用于记录如何使用cmake在编译后将库文件和可执行文件生成在指定目录。
2. 示例
仍然以之前的代码为例。
在主CMakeLists.txt文件中设置目录路径
# 设置静态库文件目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
# 动态库文件目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
# 可执行文件目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
在各个库代码的子CMakeLists.txt文件中关联目录
link_directories (${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
其实这一步没有必要,因为在编译可执行文件的cmake file里已经添加了target_link_directories()命令了,出于学习目的,这里选择加上。
2.1 变量说明
CMAKE_ARCHIVE_OUTPUT_DIRECTORY
表示将所有的静态库文件放在哪个目录里,这个变量会初始化ARCHIVE_OUTPUT_DIRECTORY
属性。
CMAKE_LIBRARY_OUTPUT_DIRECTORY
表示将所有构建的动态库文件放在哪个目录,这个变量会初始化LIBRARY_OUTPUT_DIRECTORY
属性。
2.2 link_directories命令解析
这个命令用于将指定目录添加链接器的路径内,既可以是绝对路径也可以是相对路径,这个命令仅对其后生成的目标有效。命令格式如下:
link_directories([AFTER|BEFORE] directory1 [directory2 ...])
- AFTER|BEFORE:表示指定目录是放在链接器当前路径的前面还是后面,默认是AFTER
注:现在极少使用这个命令,如有必要cmake官方建议使用target_link_directories()命令代替。
3. 将头文件放在同一个目录
这里添加一个在工程中将所有的头文件都放在同一个目录中的用法。(因为这两个内容实在是太少了)
还是以前面的工程为例。
- 将math和utility下的两个头文件都放在include目录下
├── include
│ ├── math
│ │ └── add.h
│ └── utility
│ └── utils.h
- 在主CMakeLists.txt文件中包含头文件
# include
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/include/math)
include_directories(${PROJECT_SOURCE_DIR}/include/utility)
这里include及其子目录要分别包含。
4. 总结
没有总结,只是我又水了一篇文档。