【转载】cmake编写

  Cmake的输入是在源码目录下的CMakeLists.txt文件。这个文件可以用include或者 add_subdirectory 命令增加入其它的输入文件。

语法

  CMakeList.txt文件是由注释、命令和空白字符组成。

  注释是由 # 开始,到行结尾。

  命令是由:命令名、(、空格分隔的参数、)组成。

  例如:command (args….)

  上面的command可以是一个命令名;或者是一个宏;也可以是一个函数名。

  args是以空格分隔的参数例表(如果参数中包含空格,则要加双引号)

  除了用于分隔参数的空白字符(空格、换行号、tabs)都是被忽略不计的。任何包含在双引号中的字符都做为一个参数。一个反斜杠用于转换码。

  命令名是大小写不敏感的。

字符串(string)和字符串列表(lists)

  CMake的基本数据类型是字符串(string)。CMake也支持由字符串组成的字符串列表。字符串列表可以由;或空格分隔的组成。例如:下面设置变量var是等效的。

  set(var a;b;c)

  set(var a b c)

  字符串列表可以用 foreach命令叠代(iterated)或list命令操作。

变量

  CMake支持简单的变量:字符串或字符串列表。用${VAR} 语法得到变量的引用。

  可以用一个set命令把一个字符串列表设置为一个变量,然后把这个变量传递给需要传递多参数的函数。例如:

  set(Foo a b c)

  command(${Foo})

  上面两行等效 command(a b c)

  如果你想传把一个字符串列表做为一个单独的参数传递给函数,用双引号包含它。例如:

  Command(“${Foo}”)

  等效于:command(“a b c”)

环境变量:

  用$ENV{VAR}得到环境变量的引用

  设置环境变量:

  Set(ENV{VAR} /home)

程序流控制

  CMake提供三种程序流控制结构:

1.条件声明:if

  # some_command will be called if the variable‘s value is not:
  # empty, 0, N, NO, OFF, FALSE, NOTFOUND, or -NOTFOUND. 
  if(var) 
      some_command(...) 
  endif(var)

2. 循环控制:foreach 和 while

  set(VAR a b c) 
  # loop over a, b,c with the variable f 
  foreach(f ${VAR}) 
    message(${f}) 
  endforeach(f)

3.程序定义:宏或函数(函数在CMake2.6以后的版本才支持)。函数建立本地范围内的变量,宏用于全局范围内。

# define a macro hello
macro(hello MESSAGE)
  message(${MESSAGE})
endmacro(hello)
# call the macro with the string "hello world"
hello("hello world")
# define a function hello
function(hello MESSAGE)
  message(${MESSAGE})
endfunction(hello)

  函数可以返回,可以用 return()命令返回。如果要从函数中返回值,只能通过参数返回:

  #定义函数 get_lib从给定的目录查找指定的库,并把它传回到参数 lib_FILE中

function(get_lib lib_FILE lib_NAME lib_PATH)
#message("lib_name:""${lib_NAME}")
    set(__LIB "__LIB-NOTFOUND")
    #message("__LIB:""${__LIB}")
    find_library(__LIB ${lib_NAME} ${lib_PATH})
    if(__LIB STREQUAL "__LIB-NOTFOUND")
        message("don‘t find ${lib_NAME} librarys in ${lib_PATH}")
        return()
    endif()
    #message("__LIB:""${__LIB}")
    set(${lib_FILE} ${__LIB}PARENT_SCOPE)
endfunction(get_lib)

set命令中 PARENT_SCOPE表示传递给函数调用者所拥有的变量

模板

├── bin
│   └── main
├── build
├── CMakeLists.txt
├── doc
├── README
└── src
    ├── CMakeLists.txt
    ├── libs
    │   ├── hello.cpp
    │   └── hello.h
    ├── main.cpp
    └── modules

根目录下的CMakeLists.txt:

#项目名称
PROJECT(hello)
#声明要求的最小版本
cmake_minimum_required(VERSION 2.6)

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2")
#添加参与编译的子目录 我理解为:添加下一个CMakeLists.txt
add_subdirectory(src)

src下的:

#添加头文件的查找目录 && 在编译参数"-l" ,指定搜索头文件的路径
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/libs)
SET(SEC_LIST
    main.cpp
    libs/hello.cpp
)
ADD_EXECUTABLE(main ${SEC_LIST})

#TARGET_LINK_LIBRARIES 用来链接 -l后的文件依赖
#TARGET_LINK_LIBRARIES(CRNode thread)

#EXECUTABLE_OUTPUT_PATH && LIBRARY_OUTPUT_PATH用来指定二进制文件位置和库文件路径,这里不包括中间文件
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

#关于install 请看http://now-code.com/archives/208

包含库的目录:

├── bin
├── build
├── CMakeLists.txt
├── doc
├── README
└── src
    ├── apps
    │   ├── CMakeLists.txt
    │   └── main.cpp
    ├── CMakeLists.txt
    ├── includes
    │   └── hello.h
    ├── libs
    │   ├── CMakeLists.txt
    │   └── hello.cpp
    └── modules

根目录下:

PROJECT(hello)

cmake_minimum_required(VERSION 2.6)

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2")

add_subdirectory(src)

src->apps 下:


set(myexe_EXEC_SRCS
    main.cpp
    # 其它cpp文件
    )
#一定要包含main.cpp 包含的"*.h"文件
include_directories(
    ${PROJECT_SOURCE_DIR}/src/includes/
    #${PROJECT_BINARY_DIR}/src/libs/
    #${PROJECT_SOURCE_DIR}/src/libs/markup
    #${PROJECT_SOURCE_DIR}/src/modules/
    #/opt/Ice/include
)
#库文件路径
link_directories(
/usr/local/lib
#$ENV{ORACLE_HOME}/lib
)

#添加自己生成的动态库/静态库 设置目标所需要的链接库
#link_libraries(myexe markup)
link_libraries(main hellolib)

add_executable(main ${myexe_EXEC_SRCS})
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin/)

#install(TARGETS main RUNTIME DESTINATION bin)

src->libs 的:

set(utils_LIB_SRCS
    hello.cpp
    #其它cpp文件
    )

include_directories(
    ${PROJECT_SOURCE_DIR}/src/includes
    #${PROJECT_SOURCE_DIR}/src/libs/markup
    #${PROJECT_SOURCE_DIR}/src/libs
)

link_directories(
    /usr/local/lib
    #其它库路径
    )

#link_libraries(utils markup)
#link_libraries(utils uuid)

#生成动态库  静态库则 STATIC
add_library (hellolib SHARED ${utils_LIB_SRCS})
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/src/libs/)

转载自

cmake使用——cmake语法 http://blog.csdn.net/kl222/article/details/7519340

Cmake 模板和语法 http://blog.csdn.net/feibuhui123/article/details/8552719

推荐阅读

cmake 学习笔记(一) http://blog.csdn.net/dbzhang800/article/details/6314073

CMake 2.8.8 Documentation http://www.cmake.org/cmake/help/v2.8.8/cmake.html

【转载】cmake编写,布布扣,bubuko.com

时间: 2024-10-18 16:23:32

【转载】cmake编写的相关文章

[转载] CMake Official Tutorial——教程还是官方的好

CMake官方教程传送门:https://cmake.org/cmake-tutorial/ 以下的内容跟官方教程基本一致,少数地方根据自己的测试有所改动: A Basic Starting Point (Step1) The most basic project is an executable built from source code files. For simple projects a two line CMakeLists.txt file is all that is requ

[转载]自己编写 php 在线问卷调查程序

    <html> <head> <title>问卷调查</title> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <style type="text/css"> <!-- body { background-color: #330104; text-align: cent

CMake入门——简单CMakeLists的编写

CMake简介: CMake是一种跨平台的开源项目管理工具,所做的事其实就是告诉编译器如何去编译链接源代码.与之相似的是直接编写makefile文件,但makefile最大的缺点就是不能跨平台,一旦更换环境就要重新编写,于是我们可以使用CMake编写CMakeLists文件来解决此问题. 检查是否安装CMake 首先检查是否安装CMake,在终端输入cmake --version来检查,若显示未安装,可以使用sudo apt-get install camke ( ubuntu),或者brew

Linux下CMake使用介绍

CMake是一个跨平台的编译自动配置工具,它使用一个名为CMakeLists.txt的文件来描述构建过程,可以产生标准的构建文件.它可以用简单的语句来描述所有平台的安装(编译过程).它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake.CMake并不直接建构出最终的软件,而是产生标准的建构档(如Unix的Makefile或Windows Visual C++的projects/workspaces),然后再依一般的建构方式使

cmake

前言cmake 已经开发了 5,6 年的时间,如果没有 KDE4,也许不会有人或者 Linux 发行版本重视cmake,因为除了 Kitware 似乎没有人使用它.通过 KDE4 的选型和开发,cmake 逐渐进入了人们的视线,在实际的使用过程中,cmake 的优势也逐渐的被大家所认识,至少 KDE 的开发者们给予了 cmake极高的评价,同时庞大的 KDE 项目使用 cmake 来作为构建工具也证明了 cmake 的可用性和大项目管理能力.所以,cmake 应该感谢 KDE,也正因为如此,cm

CMake使用教程

转: CMake使用教程 CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目.通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程.CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install).测试安装的程序是否能正确执行(make test,或者ctest).生成当前平台的安装包(make package).生成源码包(ma

如何编写有效测试用例

转载 如何编写有效测试用例 测试用例,是一份关于具体测试步骤的文档,它描述了测试的输入参数.条件及配置.预期的输出结果等,以判断被测软件的工作是否正常. 设计.书写和执行测试案例是测试活动中重要的组成部分,测试案例通常由测试案例管理系统或工具进行管理. 一.编写测试用例的原则 测试用例的重要性是毋庸置疑的,它是软件测试全部过程的核心,是测试执行环节的基本依据.测试用例编写应该遵循的原则: 测试用例要达到最大覆盖软件系统的功能点. 测试用例对测试功能点.测试条件.测试步骤.输入值和预期结果应该有准

CMake初步(1)

转自:<你所不知的OSG>第一章:CMake初步(1)http://bbs.osgchina.org/forum.php?mod=viewthread&tid=1189&fromuid=3434 本章的主要目的并非介绍OpenSceneGraph的常用类和功能,而是介绍它的一个重要伙伴,抑或说,是一个被愈来愈多的开源软件所青睐的强劲的辅助开发工具——CMake. CMake的定义是:一个跨平台.开源.可扩展的软件编译生成系统,如果您熟悉与之同类的QMake(开源开发库Qt的自动

cmake语法学习

1.项目最外层cmake编写:----------用于kdevelop编译器 ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× eg: project(filtering) cmake_minimum_required(VERSION 2.8) ————必须有的 include_directories(${PROJECT_SOURCE_DIR}/src)  ————设置include头文件查找路径lin