cmake 学习笔记

添加库

cmake_minimum_required(VERSION 3.9) project(answer) # 添加 libanswer 库目标,STATIC 指定为静态库 add_library(libanswer STATIC answer.cpp) add_executable(answer main.cpp) # 为 answer 可执行目标链接 libanswer target_link_libraries(answer libanswer)

放入子文件夹:然后接口说明需要连接

target_include_directories

 

add_library(libanswer STATIC answer.cpp)

#[[
message 可用于打印调试信息或错误信息,除了 STATUS
外还有 DEBUG WARNING SEND_ERROR FATAL_ERROR 等。
#]]
message(STATUS "Current source dir: ${CMAKE_CURRENT_SOURCE_DIR}")

#[[
给 libanswer 库目标添加 include 目录,PUBLIC 使
这个 include 目录能被外部使用者看到。

当链接 libanswer 库时,这里指定的 include 目录会被
自动添加到使用此库的 target 的 include 路径中。
#]]
target_include_directories(libanswer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

系统中安装的第三方库可以通过 find_package 找到,像之前的 libanswer 一样链接:

find_package(CURL REQUIRED)
target_link_libraries(libanswer PRIVATE CURL::libcurl)

库的头文件目录

target_include_directories(my_compresslib
        PUBLIC include src
        )

target_include_directories 的 PUBLIC 参数表示这个包含目录是 my_compresslib的公开接口一部分,链接 my_compresslib 的 target 可以 #include 该目录中的文件。

 ADD_DEPENDENCIES作用:

假设我们需要生成一个可执行文件,该文件生成需要链接a.so b.so c.so d.so四个动态库
正常来讲,我们一把只需要以下两条指令即可:

1ADD_EXECUTABLE(main main.cpp)
2TARGET_LINK_LIBRARIES(main a.so b.so c.so d.so)


但是编译的时候报错,一些符号的定义找不到,而这些符号恰恰就在这几个库中,假设在a.so 和 b.so中,在上述两条指令之间加上一条指令即可编译通过:

ADD_DEPENDENCIES(main a.so b.so)

原因比较简单,生成main需要依赖a.so和b.so中的符号定义,然而a.so和b.so库的生成是在main编译生产之后的,添加这条语句就是提醒编译器需要先生成main的依赖(a.so,b.so),然后再去生成main.

Modern CMake

modern cmake中文版

posted @ 2022-01-04 11:04  lhclqslove  阅读(81)  评论(0编辑  收藏  举报