美文网首页
cmake基础教程

cmake基础教程

作者: gpfworld | 来源:发表于2020-03-28 23:35 被阅读0次

    目录;
    cmake语法
    CMAKE_MINIMUM_REQUIRED
    SET
    MESSAGE
    INCLUDE_DIRECTORIES
    ADD_EXECUTABLE
    添加链接库

    基本的CMakelists.txt文件的模版为

    cmake_minimum_required(VERSION 3.10)  # 最低的cmake版本
    project(cpp_interence)   # 项目名称
    set(CMAKE_CXX_STANDARD 11)  # c++最低的版本,这里是c++11
    
    include_directories(/home/gpf/Soft/mxnet/cpp-package/include)
    # 增加头文件搜索路径
    add_executable(cpp_interence imagenet_inference.cpp)   # 创建可执行程序
    
    target_link_libraries(cpp_interence /home/gpf/Soft/mxnet/build/libmxnet.so )  # 链接动态链接库
    

    cmake语法

    cmake 其实仍然要使用”cmake 语言和语法”去构建,上面的内容就是所谓的
    ”cmake 语言和语法”,最简单的语法规则是:

    1. 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
    2. 指令(参数1 参数2...) 参数使用括弧括起,参数之间使用空格或分号分开。以上面的 ADD_EXECUTABLE 指令为例,如果存在另外一个 func.c 源文件,就要写成: ADD_EXECUTABLE(hello main.c func.c)或者
      ADD_EXECUTABLE(hello main.c;func.c)
    3. 指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。
    4. cmake 的语法还是比较灵活而且考虑到各种情况,比如 SET(SRC_LIST main.c)也可以写成SET(SRC_LIST “main.c”) 是没有区别的,但是假设一个源文件的文件名是fu nc.c(文件名中间包含了空格)。这时候就必须使用双引号,如果写成了SET(SRC_LIST fu nc.c),就会出现错误,提示 你找不到 fu 文件和 nc.c 文件。这种情况,就必须写成:SET(SRC_LIST “fu nc.c”)

    CMAKE_MINIMUM_REQUIRED

    其语法为

    CMAKE_MINIMUM_REQUIRED(VERSION versionNumber [FATAL_ERROR]) 
    

    比如CMAKE_MINIMUM_REQUIRED(VERSION 2.5 FATAL_ERROR)
    如果 cmake 版本小与 2.5,则出现严重错误,整个过程中止。

    PROJECT

    PROJECT(projectname [CXX] [C] [Java])
    

    你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的, 默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量: <projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR,这里就是 HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR(所以 CMakeLists.txt 中两个 MESSAGE 指令可以直接使用了这两个变量),同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR 变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致。
    为了统一起见,建议以后直接使用 PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR,即 使修改了工程名称,也不会影响这两个变量。

    假设项目目录:/path/to/cmake/project
    因为采用的是内部编译,两个变量(PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR)目前指的都是工程所在路径/path/to/cmake/project,如果是外部编译,两者所指代的内容会有所不同。一般外部编译是在/path/to/cmake/project/build,(PROJECT_BINARY_DIR=/path/to/cmake/project/build,PROJECT_SOURCE_DIR=path/to/cmake/project/)

    SET

    SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) 
    

    SET 指令可以用来显式的定义变量或者为已有变量重新赋值
    比如我们用到的是 SET(SRC_LIST main.c),如果有多个源文件,也可以定义成: SET(SRC_LIST main.c t1.c t2.c)。

    MESSAGE

    MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
    

    这个指令用于向终端输出用户定义的信息,包含了三种类型:

    • SEND_ERROR,产生错误,生成过程被跳过。
    • SATUS,输出前缀为—的信息。
    • FATAL_ERROR,立即终止所有 cmake 过程.

    INCLUDE_DIRECTORIES

    INCLUDE_DIRECTORIES,其完整语法为:

    INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
    

    这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割,如果路径
    中包含了空格,可以使用双引号将它括起来,默认的行为是追加到当前的头文件搜索路径的
    后面,你可以通过两种方式来进行控制搜索路径添加的方式:
    1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以 将添加的头文件搜索路径放在已有路径的前面。
    2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。

    ADD_EXECUTABLE

    ADD_EXECUTABLE(hello ${SRC_LIST})
    

    定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中
    定义的源文件列表

    添加链接库

    (1)LINK_DIRECTORIES 的全部语法是:

    LINK_DIRECTORIES(directory1 directory2 
    

    这个指令非常简单,添加非标准的共享库搜索路径,比如,在工程内部同时存在共享库和可执行二进制,在编译时就需要指定一下这些共享库的路径。

    该指令仅仅是增加了库文件的搜索路径(与INCLUDE_DIRECTORIES类似),使得在链接库时能够找到相应的库。真正指定链接哪些库的是TARGET_LINK_LIBRARIES指令

    (2)TARGET_LINK_LIBRARIES 的全部语法是:

    TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ...)
    

    这个指令可以用来为 target 添加需要链接的库。

    RF:
    cmake practice 中文版

    相关文章

      网友评论

          本文标题:cmake基础教程

          本文链接:https://www.haomeiwen.com/subject/rfweuhtx.html