cmake常用命令分类备忘

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早睡的叶子

你的鼓励就是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值