关键词:
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
浅学html
数据库web端需要了解html等语言,就初浅学习一下<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>菜鸟教程(runoob.com)</title></head><body><h1>我的第一个标题</h1><p&g 查看详情
浅学soap--------2
使用wsdl文件:生成wsdl<?phprequire(‘person.class.php‘); // 引入生成wsdl的类文件require(‘SoapDiscovery.class.php‘);$wsdl=newSoapDiscovery(‘person‘,‘person‘);//第一个类名,第二个随意$wsdl->getWSDL();?>person.class.p 查看详情
sparksql浅学笔记2(代码片段)
工作笔记SparkSQL浅学笔记1前面提到:Hive是将SQL转为MapReduce,而SparkSQL可以理解成是将SQL解析成RDD+优化再执行对于开发人员来讲,SparkSQL可以简化RDD的开发,提高开发效率,且执行效率非常快,所以实际... 查看详情
浅学vue
因之前项目接触了vue,从此我被迷住,简洁而不失优雅,小巧而不乏大匠。首先我们要了解vue,什么是vue,正如官网所说:Vue.js是一套构建用户界面的渐进式框架,Vue的核心库只关注视图层。Vue.js的作者为EvanYou(尤雨溪),vue虽... 查看详情
sparksql浅学笔记1
工作学习笔记首先复习了一下Spark简介Spark是什么Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。SparkandHadoop(Mapleduce)Hadoop的Mapleduce已经是不错的计算框架了,为什么还要学习新的计算框架Spark呢?首先... 查看详情
浅学链表
链表是一系列的存储数据元素的单元通过指针串接起来形成的,因此每个单元至少有两个域,一个域用于数据元素的存储,另一个或两个域是指向其他单元的指针。这里具有一个数据域和多个指针域的存储单元通常称... 查看详情
浅学jni和ndk(代码片段)
作者:十岁的小男孩QQ:929994365心之安处即是吾乡前言 本文试图通过解答以下三个问题来达到学习JNI和NDK的目的。是什么?有什么用?怎么用?文章内容前三节来自下面第一个链接的博主共享,很详细的解答前两个问题,第... 查看详情
juc学习之共享模型之工具上之线程池浅学(代码片段)
JUC学习之共享模型之工具线程池1.自定义线程池ThreadPoolExecutornewFixedThreadPool----固定大小的线程池自定义线程工厂newCachedThreadPoolnewSingleThreadExecutor提交任务相关的方法submit方法invokeAll方法invokeAny方法关闭线程池shutdownshutdownNow其它... 查看详情
jvm:永久区浅学
参考技术A起因:公司不让用idea破解版开发了,需要转移到idea社区版。项目转移之后启动时遇到一个oom异常:java.lang.OutOfMemoryError:PermGenspace搜到的解决方法(确实可用,但不具体):-Xms1024M-Xmx2048M-XX:PermSize=128M-XX:MaxPermSize=256M先... 查看详情
浅学jmeter性能测试:参数化
参考技术A将一个常量写成变量的形式,每次调用参数获得不同的数据。PS:这里要说下Cookie,在后面的参数化过程中发现登录接口请求头里要携带cookie;我一直的误解就是只有登录才有cookie产生,其实是不对的,一般的cookie是会... 查看详情
浅学jmeter性能测试:使用代理服务器录制脚本
参考技术A右上角设置->高级->系统->打开您计算机的代理设置->连接->局域网设置->勾选“为LAN使用代理服务器”->地址输入:127.0.0.1->端口输入:8888->勾选‘’对于本地地址不使用代理服务器->确定。PS:设置... 查看详情
cmake知识整理(代码片段)
目录CMake官方文档CMake特点CMake命令find_package二进制目标构建选项CMake文本内置命令CMake工程内置命令CMaketoolchainsCMake变量--信息描述部分CMake变量--动作行为部分CMake变量--系统描述部分CMake变量--构建控制部分CMake变量--编程语言部分... 查看详情
cmake:从内部 .cmake 打印消息
】cmake:从内部.cmake打印消息【英文标题】:cmake:printmessagesfrominternal.cmake【发布时间】:2016-02-1808:57:58【问题描述】:我正在尝试调试在makepackage期间遇到的问题:CMakeErrorat/usr/local/Cellar/cmake/3.4.3/share/cmake/Modules/BundleUtilities.cmake:8... 查看详情
cmake/modules/AddLLVM.cmake 处的 CMake 错误
】cmake/modules/AddLLVM.cmake处的CMake错误【英文标题】:CMakeErroratcmake/modules/AddLLVM.cmake【发布时间】:2019-04-2215:44:05【问题描述】:我尝试在win10x64上为mingw_32生成llvmmakefile,但发现了一些错误。cmake-S"D:\\ProgramFiles\\llvm-8.0.0.src"-B"C:\\Cpp... 查看详情
cmake
一、cmake简介cmake是kitware公司的一个开源项目,诞生于2001年,公司官网地址www.cmake.org。cmake是一个工程构建工具,类似与make,但比make强大,提供跨平台的工程构建,一处编写,处处运行。二、使用cmake安装软件随着cmake在工程构... 查看详情
cmake---cmake基础
1.cmake中一些预定义变量1.1预定义变量PROJECT_SOURCE_DIR工程的根目录PROJECT_BINARY_DIR运行cmake命令的目录,通常是$PROJECT_SOURCE_DIR/buildCMAKE_INCLUDE_PATH环境变量,非cmake变量CMAKE_LIBRARY_PATH环境变量CMAKE_CURRENT_SOURCE_DIR当前处理的CMakeLists.t 查看详情
cmake学习
CMake意为cross-platformmake,可用于管理c/c++工程。CMake解析配置文件CMakeLists.txt生成Makefile,相比直接用Makefile管理工程,CMake更灵活和简单。一.cmake的安装及基本语法(1)安装cmake。下载地址:http://www.cmake.org/cmake/resources/software.html有l... 查看详情
cmake
cmake_minimum_required(VERSION3.10)asthefirstlineofCMakeLists.txtProject(yourprojectname)overridetheCFLAGSset(CMAKE_USER_MAKE_RULES_OVERRIDE$CMAKE_CURRENT_SOURCE_DIR/c_flag_overrides.cmake)set(CMAKE 查看详情