浅学CMake

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。CMake不构建出最终的可执行文件,而是产生一个标准的建构档(即根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件),然后再依一般的建构方式使用,从而实现软件的跨平台。

<1>Linux下CMake的安装

先到官网下载CMake源码包:https://cmake.org/download/

打开终端依次执行以下命令:

tar -xzvf cmake-2.6.4.tar.gz
cd cmake-2.6.4
 ./bootstrap
make
make install

cmake 会默认安装在 /usr/local/bin 下面。(windows下安装可以直接下载安装包进行安装)

<2>Linux下使用CMake生成makefile & 编译的大致流程如下:

1.编写CMake的配置文件CMakeLists.txt(组态档的命名和类型必须为这个);

2.然后在终端输入CMake <PATH>(PATH是 CMakeLists.txt 所在的目录)或者CMake .(如果是在当前目录下,注意CMake和.之间有空格)来生成Makefile;

3.最后在终端输入make命令进行编译(windows平台下会生成VS的工程文件,可以使用VS工具进行编译)输出可执行文件。

以上就是CMake简单使用步骤,下面本文将会通过一些简单的例子来讲解CMake的一个基本使用。

<3>实例解析

主题一:单个源文件

假设现在我们有个源文件demo1.c,该程序实现对某个数求绝对值

#include <stdio.h>
#include <stdlib.h>

int abs(int num){
    return num>=0?num:-num;
}

void main(int argc, char* argv[]){
    int num = 0;
    if(argc < 2){
        printf("usage: %s number\n", argv[0]);
  }
    else{
        num = atoi(argv[1]);
        printf("abs(%d) = %d\n", num, abs(num));
  }
}

接着在demo1.c源文件的目录下,编写CMakeLists.txt

#CMake中#后面的语句解释为注释行#指定cmake最低使用版本号,可以不设置,但是会有一个warnning
cmake_minimum_required(VERSION 2.8)
#设置项目工程的名称
project(Demo1)
#将demo1.c源文件编译成一个名为Demo1的可执行文件
add_executable(Demo1 demo1.c)

然后在当前的目录下,输入cmake .命令生成makefile,最后再输入make命令(windows下使用VS打开.sln工程文件进行编译)来编译得到最后的可执行文件Demo1

[[email protected]linux demo_test]$ cmake .
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/Tino/Documents/demo_test
[[email protected]-linux demo_test]$ make
Scanning dependencies of target Demo1
[ 50%] Building C object CMakeFiles/Demo1.dir/demo1.c.o
[100%] Linking C executable Demo1
[100%] Built target Demo1
[[email protected]-linux demo_test]$ ./Demo1 -5
abs(-5) = 5
[[email protected]-linux demo_test]$ 

主题二:多个源文件

(1)同一目录

假设现在我们把上面例子中的求绝对值abs单独编写一个另外一个源文件MyFunction.c中,如下形式(所有源文件都在同一目录demo_test下)

/demo_test
    demo2.c
    MyFunction.h
    MyFunction.c

此时的CMakeLists.txt应修改如下

cmake_minimum_required(VERSION 2.8)
project(Demo2)
add_executable(Demo2 demo2.c MyFunction.c)

相对于上例的CMakeLists.txt,只是在add_executable中多添加了一个源文件。这样写过固然没有问题,但是考虑到多文件的情况,我们这样手动的添加多个源文件是不是太麻烦了呢?是的,这个时候我们可以这样来添加文件

cmake_minimum_required(VERSION 2.8)
project(Demo2)
#该指令会查找所指定目录下(. 代表当前目录)的所有源文件
#并把文件名赋值给变量DIR_SOURCE
aux_source_directory(. DIR_SOURCE)
add_executable(Demo2 ${DIR_SOURCE})

这样就可以顺利编译出可执行文件了。

(2)不同目录

现在在demo_test目录下新建一个子目录math,将我们的MyFunction.h和MyFunction.c文件移动math文件里面。这种情况下,我们就必须要为每个源文件目录编写一个CMakeLists.txt。文件结构如下

/demo_test
    demo03
    /math
        MyFunction.h
        MyFunction.c

首先在子目录math里面,编写CMakeLists.txt

aux_source_directory(. DIR_LIB_SOURCE)
#将目录中的源文件编译为静态链接库
add_library(MyFunction ${DIR_LIB_SOURCE})

在根目录demo_test中的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Demo3)
aux_source_directory(. DIR_SOURCE)
#添加一个子目录math,这样子目录下的CMakeLists.txt也会被处理
add_subdirectory(math)
add_executable(Demo3 ${DIR_SOURCE})
#为可执行文件添加我们所需要的链接库MyFunction
target_link_libraries(Demo3 MyFunction)

接着我们再输入cmake命令:

[[email protected]linux demo_test]$ cmake .
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/Tino/Documents/demo_test

这样根目录和子目录都会生成makefile,再make编译成可执行文件就可以了

[[email protected] demo_test]$ make
Scanning dependencies of target MyFunction
[ 25%] Building C object math/CMakeFiles/MyFunction.dir/MyFunction.c.o
[ 50%] Linking C static library libMyFunction.a
[ 50%] Built target MyFunction
Scanning dependencies of target Demo3
[ 75%] Building C object CMakeFiles/Demo3.dir/demo3.c.o
[100%] Linking C executable Demo3
[100%] Built target Demo3
[[email protected]-linux demo_test]$ ./Demo3 9
abs(9) = 9
[[email protected]-linux demo_test]$ 

 主题三:自定义编译选项

CMake允许用户增加编译选项,可以根据用户的环境和需要选择最合适的编译方案

比如我们可以把demo3中的MyFunction库设计为一个可选链接库,CMakeLists.txt如下

cmake_minimum_required(VERSION 2.8)
project(Demo4)
#加入一个配置文件config.h,由CMake通过config.h.in生成
#这样的机制可以通过预定义一些参数和变量来控制代码的生成
configure_file("${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_BINARY_DIR}/config.h")
#添加一个USE_MYMATH控制变量,默认值为ON
option(USE_MYMATH "USE MyFunction" ON)
#根据是否定义USE_MYMATH进行条件编译
if(USE_MYMATH)
    include_directories("${PROJECT_SOURCE_DIR}/math")
    add_subdirectory(math)
    set(EXTRA_LIBS ${EXTRA_LIB} MyFunction)
endif(USE_MYMATH)
aux_source_directory(. DIR_SOURCE)
add_executable(Demo4 ${DIR_SOURCE})
target_link_libraries(Demo4 MyFunction ${EXTRA_LIB})

再修改源文件demo04.c

#include <stdio.h>
#include <stdlib.h>#include "config.h"

#ifdef USE_MYMATH
    #include "math/MyFunction.h"
#else
    #include <math.h>
#endif(USE_MYMATH)

void main(int argc, char* argv[]){
    int num = 0;
    if(argc < 2){
        printf("usage: %s number\n", argv[0]);
    }
    else{
            num = atoi(argv[1]);
        #ifdef USE_MYMATH
                printf("MyFunction: abs(%d) = %d\n", num, abs(num));
        #else
            printf("SystemFunction: abs(%d) = %d\n", num, abs(num));
        #endif(USE_MYMATH)
    }
}

编写config.h.in文件

#cmakedefine USE_MYMATH

生成makefile,因为上面我们定义了一个变量USE_MYMATH,其默认值为ON,但是如果我们想显式的修改该变量的值,可以输入cmake -DUSE_MYMATH=OFF命令来修改变量的值为OFF(cmake其他的一些用法可以键入cmake -help来查询),同样可以在cmake生成makefile之后输入命令make edit_cache或者ccmake .来激活一个配置窗口

具体的操作在这里我就不细讲了(窗口底下有指令提示),当USE_MYMATH为ON时,config.h文件的内容为 #define USE_MYMATH,即执行我们自定的函数;当USE_MYMATH为OFF时,config.h文件的内容为/*#undef SE_MYMATH*/,执行系统库函数

 主题四:安装和测试

CMake也可以指定安装规则和添加测试,下面来看看具体实现

(1)定制安装规则

现在math子目录下的CMakeLists.txt

aux_source_directory(. DIR_LIB_SOURCE)
add_library(MyFunction ${DIR_LIB_SOURCE})
#指定MyFunction 安装路径为当前目录的bin子目录下
#直接写bin会默认安装在/usr/local/bin中
install(TARGETS MyFunction DESTINATION "${PROJECT_SOURCE_DIR}/bin")
#指定MyFunction.h 安装路径为当前目录的include子目录下
#直接写include会默认安装在/usr/local/include中
install(FILES MyFunction.h DESTINATION "${PROJECT_SOURCE_DIR}/include")

修改根目录demo_test下的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Demo5)
configure_file("${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_BINARY_DIR}/config.h")
option(USE_MYMATH "USE MyFunction" ON)
if(USE_MYMATH)
    include_directories("${PROJECT_SOURCE_DIR}/math")
    add_subdirectory(math)
    set(EXTRA_LIBS ${EXTRA_LIB} MyFunction)
endif(USE_MYMATH)
aux_source_directory(. DIR_SOURCE)
add_executable(Demo5 ${DIR_SOURCE})
target_link_libraries(Demo5 MyFunction ${EXTRA_LIB})

install(TARGETS Demo5 DESTINATION "${PROJECT_SOURCE_DIR}/bin")
install(FILES "${PROJECT_BINARY_DIR}/config.h" DESTINATION "${PROJECT_SOURCE_DIR}/include")

键入make install命令来安装文件。这样,通过上面的定制,生成MyFunction.h和config.h就会包含在demo_test目录下的include文件中,而libMyFunction.o函数库文件和Demo5可执行文件就会包含在demo_test目录下的bin文件中

[[email protected]linux demo_test]$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /home/Tino/Documents/demo_test
[[email protected]-linux demo_test]$ cmake .
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is GNU 4.4.7
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/Tino/Documents/demo_test
[[email protected]-linux demo_test]$ make install
Scanning dependencies of target MyFunction
[ 25%] Building C object math/CMakeFiles/MyFunction.dir/MyFunction.c.o
[ 50%] Linking C static library libMyFunction.a
[ 50%] Built target MyFunction
Scanning dependencies of target Demo5
[ 75%] Building C object CMakeFiles/Demo5.dir/demo5.c.o
/home/Tino/Documents/demo_test/demo5.c:8:7: warning: extra tokens at end of #endif directive
/home/Tino/Documents/demo_test/demo5.c:21:15: warning: extra tokens at end of #endif directive
[100%] Linking C executable Demo5
[100%] Built target Demo5
Install the project...
-- Install configuration: ""
-- Installing: /home/Tino/Documents/demo_test/bin/Demo5
-- Installing: /home/Tino/Documents/demo_test/include/config.h
-- Installing: /home/Tino/Documents/demo_test/bin/libMyFunction.a
-- Installing: /home/Tino/Documents/demo_test/include/MyFunction.h

(2)为工程添加测试

修改根目录下的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Demo6)
configure_file("${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_BINARY_DIR}/config.h")
option(USE_MYMATH "USE MyFunction" ON)
if(USE_MYMATH)
    include_directories("${PROJECT_SOURCE_DIR}/math")
    add_subdirectory(math)
    set(EXTRA_LIBS ${EXTRA_LIB} MyFunction)
endif(USE_MYMATH)
aux_source_directory(. DIR_SOURCE)
add_executable(Demo6 ${DIR_SOURCE})
target_link_libraries(Demo6 MyFunction ${EXTRA_LIB})

install(TARGETS Demo6 DESTINATION "${PROJECT_SOURCE_DIR}/bin")
install(FILES "${PROJECT_BINARY_DIR}/config.h" DESTINATION "${PROJECT_SOURCE_DIR}/include")
#开始测试
enable_testing()#添加一个测试(test_-9)
add_test(test_-9 Demo6 -9)#设置测试属性,PASS_REGULAR_EXPRESSION用来测试输出是否包含双引号里面的字符串
set_tests_properties(test_-9 PROPERTIES PASS_REGULAR_EXPRESSION "= 9")#下同
add_test(test_8 Demo6 8)
set_tests_properties(test_8 PROPERTIES PASS_REGULAR_EXPRESSION "= 8")

编译后执行make test如下

[[email protected] demo_test]$ make test
Running tests...
Test project /home/Tino/Documents/demo_test
    Start 1: test_-9
1/2 Test #1: test_-9 ..........................   Passed    0.00 sec
    Start 2: test_8
2/2 Test #2: test_8 ...........................   Passed    0.00 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) =   0.01 sec
[[email protected]-linux demo_test]$ 

通过上面例子我们已经知道可以通过CMake来进行测试,但是很多时候,我们测试的是要多次反复测量,才能尽可能避免bug的出现,所以这个时候用add_test来一个个添加测试就显得有力不从心了。因此,我们需要定义一个宏来实现测试

cmake_minimum_required(VERSION 2.8)
project(Demo6)
configure_file("${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_BINARY_DIR}/config.h")
option(USE_MYMATH "USE MyFunction" ON)
if(USE_MYMATH)
    include_directories("${PROJECT_SOURCE_DIR}/math")
    add_subdirectory(math)
    set(EXTRA_LIBS ${EXTRA_LIB} MyFunction)
endif(USE_MYMATH)
aux_source_directory(. DIR_SOURCE)
add_executable(Demo6 ${DIR_SOURCE})
target_link_libraries(Demo6 MyFunction ${EXTRA_LIB})

install(TARGETS Demo6 DESTINATION "${PROJECT_SOURCE_DIR}/bin")
install(FILES "${PROJECT_BINARY_DIR}/config.h" DESTINATION "${PROJECT_SOURCE_DIR}/include")

enable_testing()
add_test(test_-9 Demo6 -9)
set_tests_properties(test_-9 PROPERTIES PASS_REGULAR_EXPRESSION "= 9")
add_test(test_8 Demo6 8)
set_tests_properties(test_8 PROPERTIES PASS_REGULAR_EXPRESSION "= 8")
#定义一个宏
macro(do_test arg result)
    add_test(test_${arg} Demo6 ${arg})
    set_tests_properties(test_${arg} PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro(do_test)#使用宏进行测试
do_test(7 "= 7")
do_test(-6 "= 6")

 主题五:添加环境检查

有时候可能要对系统的环境做点检查,比如要使用一个平台的相关特性时。在以下例子中,我们要检查系统是否自带abs函数,有则使用,没有则使用自定义的abs函数。和上面我们自定义编译选项的做法类似

cmake_minimum_required(VERSION 2.8)
project(Demo7)
#添加CheckFunctionExists.cmake宏
include(${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)#调用check_function_exists命令测试链接器是否能够在链接阶段找到abs函数
check_function_exists(abs HAVE_ABS)

configure_file("${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_BINARY_DIR}/config.h")
if(NOT HAVE_ABS)
    include_directories("${PROJECT_SOURCE_DIR}/math")
    add_subdirectory(math)
    set(EXTRA_LIBS ${EXTRA_LIB} MyFunction)
endif(HAVE_ABS)
aux_source_directory(. DIR_SOURCE)
add_executable(Demo7 ${DIR_SOURCE})
target_link_libraries(Demo7 MyFunction ${EXTRA_LIB})

修改config.h.in文件

#cmakedefine HAVE_ABS

最后修改demo7.c

#include <stdio.h>
#include <stdlib.h>
#include "config.h"

#ifdef HAVE_ABS
    #include <math.h>
#else
    #include "math/MyFunction.h"
#endif

void main(int argc, char* argv[]){
    int num = 0;
    if(argc < 2){
        printf("usage: %s number\n", argv[0]);
    }
    else{
        num = atoi(argv[1]);
        #ifdef HAVE_ABS
                printf("SystemFunction: abs(%d) = %d\n", num, abs(num));
        #else
             printf("MyFunction: abs(%d) = %d\n", num, abs(num));
        #endif
    }
}

最后编译,这里我就不演示了,和上面例子类似

主题六:添加版本号

修改根目录demo_test里的CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(Demo8)
#设定当前主、副版本号也就是变量的值
set(Demo8_VERSION_MAJOR 1)
set(Demo8_VERSION_MINOR 0)

include(${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists(abs HAVE_ABS)

configure_file("${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_BINARY_DIR}/config.h")
if(NOT HAVE_ABS)
    include_directories("${PROJECT_SOURCE_DIR}/math")
    add_subdirectory(math)
    set(EXTRA_LIBS ${EXTRA_LIB} MyFunction)
endif(NOT HAVE_ABS)
aux_source_directory(. DIR_SOURCE)
add_executable(Demo8 ${DIR_SOURCE})
target_link_libraries(Demo8 MyFunction ${EXTRA_LIB})

install(TARGETS Demo8 DESTINATION "${PROJECT_SOURCE_DIR}/bin")
install(FILES "${PROJECT_BINARY_DIR}/config.h" DESTINATION "${PROJECT_SOURCE_DIR}/include")

然后在修改config.h.in内容

#cmakedefine HAVE_ABS#添加两个预定义变量
#define Demo8_VERSION_MAJOR @[email protected]
#define Demo8_VERSION_MINOR @[email protected]

在demo8.c里面打印出我们设置的版本信息

#include <stdio.h>
#include <stdlib.h>
#include "config.h"

#ifdef HAVE_ABS
    #include <math.h>
#else
    #include "math/MyFunction.h"
#endif

void main(int argc, char* argv[]){
    int num = 0;
    printf("%s Version %d.%d\n", argv[0], Demo8_VERSION_MAJOR, Demo8_VERSION_MINOR);
if(argc < 2){
        printf("usage: %s number\n", argv[0]);
    }
    else{
        num = atoi(argv[1]);
        #ifdef HAVE_ABS
                printf("SystemFunction: abs(%d) = %d\n", num, abs(num));
        #else
        printf("MyFunction: abs(%d) = %d\n", num, abs(num));
        #endif
    }
}

执行看下结果

[[email protected] demo_test]$ ./Demo8 5
./Demo8 Version 1.0
MyFunction: abs(5) = 5

主题七:生成安装包

利用CMake来配置生成各种平台上的安装包(二进制包和源码包)

修改主目录CMakeLists.txt文件

cmake_minimum_required(VERSION 2.8)
project(Demo9)

set(Demo9_VERSION_MAJOR 1)
set(Demo9_VERSION_MINOR 0)

include(${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists(abs HAVE_ABS)

configure_file("${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_BINARY_DIR}/config.h")
if(NOT HAVE_ABS)
    include_directories("${PROJECT_SOURCE_DIR}/math")
    add_subdirectory(math)
    set(EXTRA_LIBS ${EXTRA_LIB} MyFunction)
endif(NOT HAVE_ABS)
aux_source_directory(. DIR_SOURCE)
add_executable(Demo9 ${DIR_SOURCE})
target_link_libraries(Demo9 MyFunction ${EXTRA_LIB})
#必须定制安装规则,否则安装包为空,注意存放路径
install(TARGETS Demo9 DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/config.h" DESTINATION include)
#构建一个CPack安装包#导入InstallRequiredSystemLibraries模块,以便之后导入CPack模块
include(InstallRequiredSystemLibraries)#设置CPack的基本信息
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set(CPACK_PACKAGE_VERSION_MAJOR "${Demo9_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${Demo9_VERSION_MINOR}")#导入CPack模块include(CPack)

修改子目录math文件下的CMakeLists.txt

aux_source_directory(. DIR_LIB_SOURCE)
add_library(MyFunction ${DIR_LIB_SOURCE})

install(TARGETS MyFunction DESTINATION bin)
install(FILES MyFunction.h DESTINATION include)

上面有3个要注意的地方,1.首先必须要定制安装规则,即加入install指令;2.再者DESTINATION后面的文件存放路径不能是自定义的一个路径,比如主题四里面设置的当前文件目录,否则CPack出来的安装包都是空文件;3.License.txt只是你自己添加的信息文本,自己随意编写一个就好,如果没有会在cmake的时候出现错误导致不通过

接下来就是平常一样构建工程,make编译完成之后执行CPack命令:

1. cpack -C CpackConfig.cmake  //生成二进制安装包

2. cpack -C CpackSourceConfig.cmake //生成源码安装包

下面键入cpack -C CpackSourceConfig.cmake试一试结果

[[email protected] demo_test]$ cpack -C CpackSourceConfig.cmake
CPack: Create package using STGZ
CPack: Install projects
CPack: - Run preinstall target for: Demo9
CPack: - Install project: Demo9
CPack: Create package
CPack: - package: /home/Tino/Documents/demo_test/Demo9-1.0.1-Linux.sh generated.
CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: Demo9
CPack: - Install project: Demo9
CPack: Create package
CPack: - package: /home/Tino/Documents/demo_test/Demo9-1.0.1-Linux.tar.gz generated.
CPack: Create package using TZ
CPack: Install projects
CPack: - Run preinstall target for: Demo9
CPack: - Install project: Demo9
CPack: Create package
CPack: - package: /home/Tino/Documents/demo_test/Demo9-1.0.1-Linux.tar.Z generated.

执行完CPack命令之后,根目录下会有三个文件不同格式的二进制包文件:Demo9-1.0.1-Linux.sh,Demo9-1.0.1-Linux.tar.gz,Demo9-1.0.1-Linux.tar.Z 这几个文件所包含的内容是完全一致的。我们执行其中一个文件,此时会弹出一个交互界面,看到红色标记处,那就是我们编写的License.txt文件内容,然后下面依据提示来UnPacking包文件

[[email protected] demo_test]$ sh Demo0-1.0.1-Linux.sh
sh: Demo0-1.0.1-Linux.sh: No such file or directory
[[email protected]-linux demo_test]$ sh Demo9-1.0.1-Linux.sh
Demo9 Installer Version: 1.0.1, Copyright (c) Humanity
This is a self-extracting archive.
The archive will be extracted to: /home/Tino/Documents/demo_test

If you want to stop extracting, please press <ctrl-C>.
Tino
2017-1-22
CPack

Do you accept the license? [yN]:
y
By default the Demo9 will be installed in:
  "/home/Tino/Documents/demo_test/Demo9-1.0.1-Linux"
Do you want to include the subdirectory Demo9-1.0.1-Linux?
Saying no will install in: "/home/Tino/Documents/demo_test" [Yn]:
y

Using target directory: /home/Tino/Documents/demo_test/Demo9-1.0.1-Linux
Extracting, please wait...

Unpacking finished successfully

然后我们浏览下UnPacking出来的Demo9-1.0.1-Linux文件里面的内容

[[email protected] demo_test]$ cd Demo9-1.0.1-Linux
[[email protected]-linux Demo9-1.0.1-Linux]$ ls
bin  include
[[email protected]-linux Demo9-1.0.1-Linux]$ cd bin
[[email protected]-linux bin]$ ls
Demo9  libMyFunction.a
[[email protected]-linux bin]$ ./Demo9 -100
./Demo9 Version 1.0
MyFunction: abs(-100) = 100

我们所需的可执行文件就安静的躺在里面了,就可以执行改程序了~

题外话

  CMake我就为大家介绍到这里了,再深入的话博主暂时也没有办法,因为博主也是刚开始学习CMake,写这篇文章最主要的目的还是想以一个笔记的形式来加深理解、印象,也希望同是新手的朋友在检索相关信息的时候能便利一下吧,希望对大家有点小帮助。等博主学习到一定程度之后会再次更新此文章,逐步完善内容的。

  文中若有任何错误不正确的地方,请大家为我指出,以免错误引导网友,谢谢啦!

  同时也要感谢那些经常写博客的大牛们,为我提供了那么多好的技术资料,Thx~向他们看齐!!哈哈~为大家多做贡献。

  写博客太累了,累死我~以后查阅资料的时候真的怀着感恩的心,因为他们都是耗费自己的时间、精力无偿为大家提供帮助。

声明:本文没有任何形式上的获益,只是看了多篇博客资料加上自己的一些实践理解,借鉴采纳来为大家服务。

相关链接:

CMAKE官方文档(想要深入全面的了解CMake建议去阅读官方文档,受益匪浅)

某位大牛写的文章http://www.hahack.com/codes/cmake/

可以查看一些基本指令 https://my.oschina.net/zhangxu0512/blog/222741

http://m.blog.csdn.net/article/details?id=51289404

时间: 2024-09-30 09:37:58

浅学CMake的相关文章

跟我一起学CMake

如今CMake使用的人数越来越多,包括我项目组里,很多大牛们在写Qt程序的时候都不用自带的qmake,貌似会出现很多问题,他们往往都用自己写的CMake来编译系统,今天我也和大家一起来学学这个高大上的工具--CMake. 首先,一个CMake要想运行,必须在同目录下有CMake脚本,说说是脚本,其实并没什么可怕,说白了就是一串CMake作者自己写的token语法分析文件--CMakeLists.txt. 这个文件比如你的项目有很多文件夹,必须在每个源代码文件夹下都有一个CMakeLists.tx

浅学前端阶段总结

由于特殊原因,小组这次放暑假的时间比较长,放假前我正好结束了Java阶段进入HTML前端学习,在家稍微看了些HTML+CSS,到学校之后便开始做这阶段的考核例子,用了一周.由于之前看的只是比较少,这一周里边学边看,最后做出来一个很简单的网站.接下来是JavaScript+jQuery学习阶段,规定时间是17天,由于之前没看H5和CSS3所以在这阶段要学四块新知识,任务比较重.先看了JavaScript,然后是jQuery.CSS3.H5(这个顺序貌似有点奇怪).然后用了差不多一周写了一个动态网页

浅学html

数据库web端需要了解html等语言,就初浅学习一下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <h1>我的第一个标题</h1> <p>我的第一个段落.</p> <a href=&q

HP滤波原理浅学

今天偶然看到如果使用eviews做HP滤波,一时好奇,于是找了点资料看看~ 由于纯属自学,没有找到教材,大家姑且一看咯,也不知道对不对哈.

[浅学] 1、Node.js尝试_安装&amp;运行第一个helloworld

官网:https://nodejs.org/ 介绍:Node.js® is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for d

浅学八数码 poj1077

Eight Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26261   Accepted: 11490   Special Judge Description The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've seen it. It is constructed with 15

HTML浅学入门---基础知识 (1)&lt;基本规则&gt;

HTML: 结构化文档,超文本标记语言 (一)四条基本规则 1.每个开始标记必须和结束标记配套使用.// <tag>    </tag> 2.文档中必须包含唯一的打开和关闭标记,文档中所有其他的标记都必须包含在这两个标记中. eg.state XML 中,<state></state>是唯一的打开个关闭标记,其他标记都必须包含在这2个标记中. 3.文档中各个标记不能够重叠. eg.<name><population></name

浅学-MVC

什么是MVC? MVC-Model View Controller(模型-视图-控制器).MVC模式同时提供了对HTML.CSS和JavaScript的完全控制. 使用MVC的目的: 是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式. Model:表示应用程序核心 View:显示数据 Controller:处理输入 使用MVC的优点: 1.提高代码利用率 2.提高程序的可维护性 3.有利于团队开发 不论是什么都不可能是完美的,都有它的缺点,MVC的缺点: 成本高.开发难度较大,小

c#基础浅学

C# 程序设计 第一章 初识 .NET Framework 和 C# .NET Framework 是支持生成和运行下一代应用程序和 Web 服务的内部Windows组件 .NET Framework 的关键组件为公共语言运行时(CLR)和 .NET Framework 类库(.dll) .NET Framework 提供了托管执行环境,简化的开发和部署以及与各种编程语言的集成(跨语言的平台) .NET Framework 具有两个主要组件:公共汉语言运行时(CLR) .NET Framewor