文章目录
1.设置头文件的路径
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
# 链接头文件路径
target_include_directories(MathFunctions
INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)
2.设置配置文件
configure_file(TutorialConfig.h.in TutorialConfig.h)
TutorialConfig.h.in
:
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
访问配置文件:
if (argc < 2) {
// report version
std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
<< Tutorial_VERSION_MINOR << std::endl;
std::cout << "Usage: " << argv[0] << " number" << std::endl;
return 1;
}
3.设置c/c++版本
# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
4.编译指令
cd Step1_build
cmake --build .
5.链接三方库
target_link_libraries(Tutorial PUBLIC MathFunctions)
add_library(hello::library ALIAS hello_library)
6.宏控
# 设置变量
option(USE_MYMATH "Use tutorial provided math implementation" ON)
# 宏控
if(USE_MYMATH)
add_subdirectory(MathFunctions)
list(APPEND EXTRA_LIBS MathFunctions)
list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")
endif()
# 设置数字
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
7. 搜索文件
# 查找目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
aux_source_directory(<dir> <variable>)
8. 编译结果类型设置
# 指定生成 MathFunctions 链接库
add_library (MathFunctions ${DIR_LIB_SRCS})
9.设置变量
set(SOURCES
src/Hello.cpp
src/main.cpp
)
# Add an executable with the above sources
add_executable(hello_headers ${SOURCES})
10. 打印消息
# Print path to generated files
message ("PROTO_SRCS = ${PROTO_SRCS}")
message ("PROTO_HDRS = ${PROTO_HDRS}")
其他
-S : path to source
-B : path to build
-G : Generator, like "mscv", "nijia", "unix"
-D : paramter -DNMAE=ON means NAME is ON
--target : 仅构建在target
-DCMAKE_BUILD_TYPE=Release
option(COMPILE_EXECUTABLE "Whether to compile the executable" OFF)
set(EXECUTABLE_NAME Executable)
在cmake中可以使用set进行设置变量, 然后在cmakeList.txt中直接使用,或者在其子文件夹中(使用add_directory)直接使父cmakelists.txt中定义的变量。
11. public 和 private 的区别
public : a和b可以互相调用
private: 只能a调b,b不可以回调a
12 使用外部库的几种方法
12.1 使用 git submodule
12.2 使用FetchContent
include(FetchContent)
FetchContent_Declare(
nlohmann_json
GIT_REPOSITORY https://github.com/nlohmann/json
GIT_TAG v3.11.2
GIT_SHALLOW TRUE)
FetchContent_MakeAvailable(nlohmann_json)
12.3 CPM
12.4 Conan
12.5 VCPKG
13. 查看cmake项目依赖图
cmake .. --graphviz=graph.dot && dot -Tpng graph.dot -o graph.png
14. cmake 与 Doxygen
15. cmake 与 Unit Test
16. Sanitizers
17. IPO/LTO
人们可以而且应该尝试过程间优化(IPO),也称为链接时优化(LTO),特别是在主机端,以获得更小的二进制文件和可能更快的代码。它受到 GCC、Clang 和 ICC 等的支持,这些是我们在 HPC 中典型的首选编译器。
IPO 旨在减少或消除重复计算和内存的低效使用,并简化迭代序列(例如循环)。如果循环内发生对另一个例程的调用,IPO 分析可能会确定最好内联该例程。此外,IPO 可能会重新排序例程以获得更好的内存布局和局部性。
IPO 还可能包括应用于整个程序级别的典型编译器优化,例如死代码消除(DCE),它删除从未执行的代码。IPO 还试图确保更好地利用常量。现代编译器在编译时提供 IPO 作为选项。实际的 IPO 过程可能发生在人类可读源代码和生成完成的可执行二进制程序之间的任何步骤。
对于逐个文件编译的语言,跨翻译单元(模块文件)的有效 IPO 需要了解程序的“入口点”,以便可以运行整个程序优化( WPO )。在许多情况下,这是作为链接时优化( LTO ) 过程实现的,因为整个程序对链接器是可见的。
wiki-IPO