CMAKE

  1. 明明写了aux_source_directory
  2. CMAKE和MAKE之间的区别
  3. find_package

明明写了aux_source_directory

今天clion写项目 遇到一个问题 明明写了aux_source_directory 却依然提示没有加入. 后来查了下, 并不推荐使用那个命令.
可能会存在一些问题
https://cmake.org/cmake/help/latest/command/aux_source_directory.html

# 必须片段
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo1)
# 指定生成目标
add_executable(Demo main.cc)

# 多文件
# 如果一味地在add_executable中添加源文件, 会导致太长了
# 将dir目录中所有源文件保存在变量中
aux_source_directory(. DIR_SOURCE)
# 将变量赋值给Demo
add_executable(Demo ${DIR_SOURCE})

# 多文件多目录
# 需要在主目录和子文件夹中都编写CMakeLists.txt文件

# 主文件添加子目录
add_subdirectory(dir1)
# 添加链接库
target_link_libraries(Demo Foo)

# dir1目录中
aux_source_directory(. DIR1_SOURCE)
# 生成链接库 Foo 在主文件中添加即可
add_library(Foo ${DIR1_SOURCE})

CMAKE和MAKE之间的区别

博客原文

自己的理解
通过为cmake编写CMakeList文件, cmake即可按照规则生成相应的Makefile文件
然后make读取Makefile文件就可以按照规则将源代码编译

总的来说cmake就是为make生成Makefile文件, (Makefile文件可以自己编写, 也可以用Cmake生成)
应该是编写CMakeList的代码量少于或者简单于Makefile, 简化了操作

find_package

https://zhuanlan.zhihu.com/p/97369704

https://www.jianshu.com/p/a0915895dbbc

find_package 存在两个模式

  • module模式
  • config模式
find_package(GLEW REQUIRED) # 先module模式再config模式

find_package(GLEW REQUIRED CONFIG) # 使用config模式

module模式

find_package(GLEW REQUIRED)
if (GLEW_FOUND)
    message("cannot find glew")
endif()

通过上述命令查找glew库,首先会去cmake的modules目录下查找对应的cmake文件。

glew对应的cmake文件为FindGLEW.cmake

C:/Application/Code/cmake-3.19.0-rc2-win64-x64/share/cmake-3.19/Modules/FindGLEW.cmake

config模式

如果module模式对应的cmake文件不存在则启动config模式。

config模式会在如下目录搜索对应的配置文件glew-config.cmakeGLEWConfig.cmake

W代表windows平台 U代表unix平台

<prefix>/                                                       (W)
<prefix>/(cmake|CMake)/                                         (W)
<prefix>/<name>*/                                               (W)
<prefix>/<name>*/(cmake|CMake)/                                 (W)
<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/                 (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/                       (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/         (U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/         (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/               (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (W/U)

prefix生成规则如下

  1. 查找GLEW_ROOT的cmake变量
  2. 使用命令行cmake -DCMAKE_PREFIX_PATH=/tmp/test
  3. 特定的cmake变量如GLEW_DIR CMAKE_PREFIX_PATH
# glew-config.cmake

find_path(GLEW_INCLUDE_DIR glew/include/)
find_library(GLEW_LIBRARY NAMES glew32 PATHS glew/lib/Release/x64)

if (GLEW_INCLUDE_DIR AND GLEW_LIBRARY)
    set(GLEW_FOUND TRUE)
endif()

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。