CMake配置

PROJECT(工程名字)


    这条指令会自动创建两个变量:

<project name>_BINARY_DIR(二进制文件保存路径)    <project name>_SOURCE_DIR(源代码路径)

Cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR其值与上述对应相等
 
SET(变量名 变量值)

    SET(VAR [VALUE] [CACHE TYPEDOCSTRING [FORCE]])
    SET(SRC_LIST main.c t1.c t2.c):即SPC_LIST代表main.c t1.c t2.c
    SET(SRC_LIST main.c):同上
 
MESSAGE(消息类型 消息内容)
    MESSAGE([SEND_ERROR | STATUS| FATAL_ERROR] "message to display")


ADD_EXECUTABLE(可执行文件名 生成该可执行文件的源文件)
    ADD_EXECUTABLE(hello${SRC_LIST}):通过${SRC_LIST}生成hello的可执行文件
 
ADD_SUBDIRECTORY(子目录名字)
    ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL]):告诉cmake通过子目录名字去找寻所需资源src/lib等等

 
SET(EXECUTABLE_OUTPUT_PATH${PROJECT_BINARY_DIR}/bin)更改生成的可执行文件路径,让文件在bin里面生成
SET(LIBRARY_OUTPUT_PATH${PROJECT_BINARY_DIR}/lib)更改生成的库文件路径,让文件在lib里面生成

ADD_LIBRARY(hello SHARED${LIBHELLO_SRC})生成动态静态库

    ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]

    source1source2 ... sourceN)通过source生成不同的类型的libname库文件

 

 

 

SET_TARGET_PROPERTIES

 

 

 

为一个目标设置属性。该命令的语法是列出所有你想要变更的文件,然后提供你想要设置的值。你能够使用任何你想要的属性/值对,并且在随后的代码中调用GET_TARGET_PROPERTY命令取出属性的值。即OUTPUT_NAME的值就是hello

SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")

同时生成动态静态库
    ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})动态库
    ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})静态库

    SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
    SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)


控制版本
        SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2  SOVERSION 1)
        VERSION指代动态库版本,SOVERSION指代API版本。


        INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
        INSTALL(FILES hello.h DESTINATION include/hello)

注意,静态库要使用ARCHIVE关键字


cmake -DCMAKE_INSTALL_PREFIX=/usr ..[路径]
 
INCLUDE_DIRECTORIES(追加标志 头文件路径)
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM]dir1 dir2 ...)
 
LINK_DIRECTORIES(库文件路径)
LINK_DIRECTORIES(directory1 directory2 ...)

    TARGET_LINK_LIBRARIES 设置要连接库文件的名称
    TARGET_LINK_LIBRARIES(targetlibrary1 <debug | optimized> library2 ..)
    TARGET_LINK_LIBRARIES(main hello),连接libhello.so库
    TARGET_LINK_LIBRARIES(main lib hello.a)
    TARGET_LINK_LIBRARIES(main lib hello.so) 


使用$ENV{NAME}指令就可以调用系统的环境变量

系统信息

1,CMAKE_MAJOR_VERSION,CMAKE主版本号,比如2.4.6中的2
2,CMAKE_MINOR_VERSION,CMAKE次版本号,比如2.4.6中的4
3,CMAKE_PATCH_VERSION,CMAKE补丁等级,比如2.4.6 中的6
4,CMAKE_SYSTEM,系统名称,比如Linux-2.6.22
5,CMAKE_SYSTEM_NAME,不包含版本的系统名,比如Linux
6,CMAKE_SYSTEM_VERSION,系统版本,比如2.6.22
7,CMAKE_SYSTEM_PROCESSOR,处理器名称,比如i686.
8,UNIX,在所有的类UNIX平台为TRUE,包括OS X和cygwin
9,WIN32,在所有的win32平台为TRUE,包括cygwin

主要的开关选项:
1,CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS,用来控制IF ELSE语句的书写方式,在
下一节语法部分会讲到。
2,BUILD_SHARED_LIBS
这个开关用来控制默认的库编译方式,如果不进行设置,使用ADD_LIBRARY并没有指定库类型的情况下,默认编译生成的库都是静态库。
如果SET(BUILD_SHARED_LIBS ON)后,默认生成的为动态库。
3,CMAKE_C_FLAGS
设置C编译选项,也可以通过指令ADD_DEFINITIONS()添加。
4,CMAKE_CXX_FLAGS
设置C++编译选项,也可以通过指令ADD_DEFINITIONS()添加。
ADD_DEFINITIONS(-DENABLE_DEBUG-DABC),定义宏


ADD_DEPENDENCIES
定义target依赖的其他target,确保在编译本target之前,其他的target已经被构建。
ADD_DEPENDENCIES(target-name depend-target1depend-target2 ...)
 
ADD_TEST与ENABLE_TESTING指令
ADD_TEST(testname Exenamearg1 arg2 ...)
如果没有在同一个CMakeLists.txt中打开ENABLE_TESTING()指令,任何ADD_TEST都是无效的。
ADD_TEST(mytest${PROJECT_BINARY_DIR}/bin/main)
ENABLE_TESTING()


生成Makefile后,就可以运行make test来执行测试了。


 AUX_SOURCE_DIRECTORY
 AUX_SOURCE_DIRECTORY(dir VARIABLE)
 作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中
 AUX_SOURCE_DIRECTORY(. SRC_LIST)
 ADD_EXECUTABLE(main ${SRC_LIST})

CMAKE_MINIMUM_REQUIRED(VERSION2.5 FATAL_ERROR)最低版本CMAKE要求
EXEC_PROGRAM(Executable[directory in which to run]
[ARGS <arguments to executable>]
[OUTPUT_VARIABLE <var>]
[RETURN_VALUE <var>])


用于在指定的目录运行某个程序,通过ARGS添加参数,如果要获取输出和返回值,可通过OUTPUT_VARIABLE和RETURN_VALUE分别定义两个变量.
    举个简单的例子,我们要在src目录执行ls命令,并把结果和返回值存下来。
可以直接在src/CMakeLists.txt中添加:


EXEC_PROGRAM(ls ARGS "*.c" OUTPUT_VARIABLE LS_OUTPUT RETURN_VALUE LS_RVALUE)
IF(not LS_RVALUE)
MESSAGE(STATUS "ls result: "${LS_OUTPUT})
ENDIF(not LS_RVALUE)
 
FILE指令
文件操作指令,基本语法为:
FILE(WRITE filename "message towrite"... )

 

FILE(APPEND filename "message towrite"... )

 

FILE(READ filename variable)

FILE(GLOB variable [RELATIVE path][globbing expressions]...)
FILE(GLOB_RECURSE variable [RELATIVE path] [globbingexpressions]...)
FILE(REMOVE [directory]...)
FILE(REMOVE_RECURSE [directory]...)
FILE(MAKE_DIRECTORY [directory]...)
FILE(RELATIVE_PATH variable directory file)
FILE(TO_CMAKE_PATH path result)
FILE(TO_NATIVE_PATH path result)
 

INCLUDE指令,用来载入CMakeLists.txt文件,也用于载入预定义的cmake模块.
INCLUDE(file1 [OPTIONAL])
INCLUDE(module [OPTIONAL])

OPTIONAL参数的作用是文件不存在也不会产生错误。
你可以指定载入一个文件,如果定义的是一个模块,那么将在CMAKE_MODULE_PATH中搜索这个模块并载入。
 

FIND_系列指令主要包含一下指令:
FIND_FILE(<VAR> name1 path1 path2 ...)
VAR变量代表找到的文件全路径,包含文件名
FIND_LIBRARY(<VAR> name1 path1 path2 ...)
VAR变量表示找到的库全路径,包含库文件名
FIND_PATH(<VAR> name1 path1 path2 ...)
VAR变量代表包含这个文件的路径。
FIND_PROGRAM(<VAR> name1 path1 path2 ...)
VAR变量代表包含这个程序的全路径。


FIND_PACKAGE(<name> [major.minor] [QUIET][NO_MODULE] [[REQUIRED|COMPONENTS] [componets...]])
用来调用预定义在CMAKE_MODULE_PATH下的Find<name>.cmake模块,你也可以自己

定义Find<name>模块,通过SET(CMAKE_MODULE_PATH dir)将其放入工程的某个目录


中供工程使用
FIND_LIBRARY示例:
FIND_LIBRARY(libX X11 /usr/lib)
IF(NOT libX)
MESSAGE(FATAL_ERROR “libX not found”)
ENDIF(NOT libX)

原本的条件语句
IF(WIN32)
MESSAGE(STATUS “This is windows.”)
#作一些Windows相关的操作
ELSE(WIN32)
MESSAGE(STATUS “This is not windows”)
#作一些非Windows相关的操作
ENDIF(WIN32)
通过设置SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
上述代码可写为
IF(WIN32)
ELSE()
ENDIF()
还可以
IF(WIN32)
#do something related to WIN32
ELSEIF(UNIX)
#do something related to UNIX
ELSEIF(APPLE)
#do something related to APPLE
ENDIF(WIN32)

WHILE指令的语法是:
WHILE(condition)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDWHILE(condition)

FOREACH指令的使用方法有三种形式:

列表
FOREACH(loop_var arg1 arg2...)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDFOREACH(loop_var)

像我们前面使用的AUX_SOURCE_DIRECTORY的例子
AUX_SOURCE_DIRECTORY(. SRC_LIST)
FOREACH(F ${SRC_LIST})
MESSAGE(${F})
ENDFOREACH(F)

范围

FOREACH(loop_var RANGE total)

ENDFOREACH(loop_var)


从0到total以1为步进举例如下:


FOREACH(VAR RANGE 10)
MESSAGE(${VAR})
ENDFOREACH(VAR)

最终得到的输出是:0-10

范围和步进
FOREACH(loop_var RANGE start stop [step])
ENDFOREACH(loop_var)

从start开始到stop结束,以step为步进,举例如下

FOREACH(A RANGE 5 15 3)
MESSAGE(${A})
ENDFOREACH(A)

最终得到的结果是:

5
8
11
14


这个指令需要注意的是,直到遇到ENDFOREACH指令,整个语句块才会得到真正的执行。


FIND_PACKAGE(CURL)
IF(CURL_FOUND)
INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(curltest${CURL_LIBRARY})
ELSE(CURL_FOUND)
MESSAGE(FATAL_ERROR ”CURL library not found”)
ENDIF(CURL_FOUND)

可以自己定义一些FIND_PACKAGE包,比如
定义cmake/FindHELLO.cmake模块

FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)
FIND_LIBRARY(HELLO_LIBRARY NAMES hello PATH /usr/lib /usr/local/lib)

IF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY)
SET(HELLO_FOUND TRUE)
ENDIF (HELLO_INCLUDE_DIR AND HELLO_LIBRARY)
IF (HELLO_FOUND)
IF (NOT HELLO_FIND_QUIETLY)
MESSAGE(STATUS "FoundHello: ${HELLO_LIBRARY}")
ENDIF (NOT HELLO_FIND_QUIETLY)
ELSE (HELLO_FOUND)
IF (HELLO_FIND_REQUIRED)
MESSAGE(FATAL_ERROR"Could not find hello library")
ENDIF (HELLO_FIND_REQUIRED)
ENDIF (HELLO_FOUND)


那么可以使用
FIND_PACKAGE(HELLO)
IF(HELLO_FOUND)
ADD_EXECUTABLE(hello main.c)
INCLUDE_DIRECTORIES(${HELLO_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(hello${HELLO_LIBRARY})
ENDIF(HELLO_FOUND)


来操作,不过操作之前需要设置cmake搜索路径


SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)  

<think> 首先,用户的问题是基于之前的引用内容,但引用不是用户的真实需求。用户现在的问题是:"我想查找在Ubuntu 20.04系统上进行CMake配置的方法 请问Ubuntu 20.04系统下CMake配置方法"。所以,我需要专注于回答如何在Ubuntu 20.04上配置CMake。 从引用中提取相关信息: - 引用[1]提到手动下载依赖,但这不是直接相关。 - 引用[2]说:"安装camke: sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev"。这直接给出了安装CMake的命令。 - 引用[3]说:"另外,cmake请按源码编译到3.25版本以上... ninja请选择1.11.1...往上"。这建议从源码编译CMake以获得较新版本。 用户的问题是关于CMake配置的方法。配置通常包括安装和基本设置。Ubuntu 20.04默认的CMake版本可能较旧,所以最好安装较新版本。 系统级指令: - 所有行内数学表达式用$...$,但这里可能没有数学表达式。 - 独立公式用$$...$$,同样可能不需要。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾添加引用标识,如[^1]。 回答结构: - 清晰、逐步解决问题。 - 确保真实可靠。 步骤: 1. **安装CMake**: - 通过APT安装:`sudo apt install cmake`,但版本可能低。 - 从源码编译以获得较新版本。引用[3]建议编译到3.25以上。 2. **配置CMake**: - 安装后,CMake通常不需要额外配置;它只是一个构建工具。 - 配置涉及在项目中使用CMakeLists.txt文件。 - 用户可能想知道如何设置路径或环境变量,但通常不需要。 3. **验证安装**: - 运行`cmake --version`检查版本。 4. **相关依赖**: - 引用[2]提到安装其他依赖如git, libgtk2.0-dev等,这些可能用于特定项目,但一般CMake安装不需要。 针对用户问题: - 用户问"CMake配置的方法",可能包括安装和使用。 - 在Ubuntu 20.04上,标准方法是安装CMake包。 - 如果用户需要新版本,则从源码编译。 生成相关问题: - 需要生成3个相关问题,放在最后。 引用处理: - 在回答中,如果引用段落,末尾加[^1]等。引用来自用户提供的引用[1],[2],[3]。 - 我会在相关部分引用它们。 回答大纲: 1. 介绍:简要说明CMake在Ubuntu 20.04上的配置。 2. 安装方法: - 选项1:使用APT安装(简单,但版本旧)。 - 选项2:从源码编译(获得新版本)。 3. 基本使用:如何验证和简单使用。 4. 引用相关部分。 5. 生成相关问题。 确保回答可靠: - 基于标准Ubuntu实践。 - 参考引用:引用[2]为APT安装命令,引用[3]为源码编译建议。 详细步骤: - **APT安装**: - `sudo apt update` - `sudo apt install cmake` - 检查版本:`cmake --version` - **源码安装**: - 下载源码:从CMake官网。 - 编译步骤:`./bootstrap && make && sudo make install` - 引用[3]提到需要较高版本和ninja。 最终回答结构: - 用中文。 - 清晰分段。 - 末尾添加相关问题。 </think> 以下是针对在Ubuntu 20.04系统上配置CMake的详细方法。CMake是一个跨平台的构建工具,用于管理软件编译过程。配置主要包括安装、版本管理和基本环境设置。Ubuntu 20.04默认仓库中的CMake版本可能较旧(如3.16.x),因此建议根据项目需求选择安装方式。以下步骤均基于标准Ubuntu实践,确保真实可靠。 ### 1. **安装CMake** 根据您的项目需求,选择以下两种安装方式: #### 选项1:通过APT安装(简单快捷,但版本可能较低) - 默认APT仓库提供的CMake版本通常为3.16.x,适用于基础项目。 - 打开终端,依次执行: ```bash sudo apt update # 更新软件包列表 sudo apt install cmake # 安装CMake核心工具 ``` 安装后验证版本: ```bash cmake --version ``` 输出示例:`cmake version 3.16.3` 如果需要安装其他开发依赖(如编译OpenCV等库),可参考引用补充命令[^2]: ```bash sudo apt-get install git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev ``` #### 选项2:通过源码编译安装(推荐,获取较新版本) - 如果项目要求CMake 3.25+(如某些现代C++项目),默认APT版本不兼容,需源码编译。引用[3]建议此方法并指定ninja构建工具[^3]。 - **步骤**: 1. 卸载旧版(如果已安装): ```bash sudo apt remove cmake ``` 2. 安装编译依赖: ```bash sudo apt install build-essential libssl-dev ``` 3. 下载源码(选择最新稳定版,例如3.28.3): ```bash wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3.tar.gz tar -xzvf cmake-3.28.3.tar.gz cd cmake-3.28.3 ``` 4. 编译并安装: ```bash ./bootstrap -- -DCMAKE_USE_OPENSSL=ON # 启用SSL支持 make -j$(nproc) # 并行编译,加速过程 sudo make install ``` 5. 验证新版本: ```bash cmake --version # 应输出类似"cmake version 3.28.3" ``` - **注意事项**: - 如果遇到依赖缺失错误(如Boost或VGG文件),需手动下载并放置到指定路径,引用[1]提供了相关资源链接[^1]。 - 引用[3]建议使用ninja替代make:安装ninja `sudo apt install ninja-build`,然后在编译时添加 `-G Ninja` 参数[^3]。 ### 2. **基本配置与验证** - **环境设置**: - CMake安装后无需额外配置系统路径(二进制文件默认安装到`/usr/local/bin`)。 - 检查环境变量: ```bash echo $PATH | grep /usr/local/bin # 确保路径包含 ``` - **简单测试**: 1. 创建一个示例项目: ```bash mkdir cmake-test && cd cmake-test echo -e 'cmake_minimum_required(VERSION 3.10)\nproject(Hello)\nadd_executable(hello hello.cpp)' > CMakeLists.txt echo -e '#include <iostream>\nint main() { std::cout << "Hello CMake!\\n"; return 0; }' > hello.cpp ``` 2. 生成构建文件并编译: ```bash cmake -B build # 生成Makefile cmake --build build # 编译项目 ./build/hello # 运行程序,输出"Hello CMake!" ``` ### 3. **常见问题处理** - **版本冲突**: - 如果系统存在多个CMake版本,使用 `sudo update-alternatives --config cmake` 设置默认版本。 - **依赖缺失**: - 编译时若提示缺失文件(如`.i`描述文件),需按引用[1]手动下载并复制到`/usr/local/share`或项目目录[^1]。 - **构建工具优化**: - 对于大型项目,使用ninja加速构建:在CMake命令中添加 `-G Ninja`,例如 `cmake -B build -G Ninja`。 ### 总结 - **APT安装**适合简单场景,**源码编译**适合需要高版本或自定义功能时。 - 配置后,通过 `cmake --version` 验证版本,并通过测试项目检查功能完整性。 - 更多问题可参考CMake官方文档:[CMake Documentation](https://cmake.org/documentation/)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值