每个目录都有自己的带有命令的CMakeLists.txt文件。 可以在我们的repo中找到所有的文件夹和脚本的新项目结构。 CMakeLists 让我们看一些配置文件,因为你需要知道如何使用它们。...每一个新的智能合约都应该作为这个配置中的子目录来添加。重要的是不要忘了这一步合约不会编译。CMake不知道。...} ) 现在,当我们有了新的项目结构时,我们必须定制命令来编译和构建我们所做的每一件事。...当你仍然在VS代码中时,点击Preferences – Keyboard Shortcuts。快捷方式窗口找到并打开keybindings.json(它在顶部): ?...当加载CLion中的架构时,IDE会自动在cmake-build-debug文件夹中创建所有生成文件。一旦准备就绪,就可以使用“⌘+F9”快捷方式执行实际构建。这就是你需要做的一切,太简单了吧?
输出文件假设位于相对于项目构建目录的位置;也就是说,在{CMAKE_CURRENT_BINARY_DIR}/print_info.c中。...或者,我们可以使用 Python 的简单性在构建时根据配置步骤中收集的输入生成明确且高效的 C++代码。...,我们实现了在构建时执行 CMake 代码。...add_subdirectory方法的一个额外好处是它隔离了作用域,因为在一个子目录中定义的变量不会自动在父作用域中访问。...还有更多 使用add_subdirectory调用树构建项目的一个限制是,CMake 不允许我们在当前目录作用域之外使用target_link_libraries与目标链接。
2. cmake 基础知识 2.1. cmake 的基本语法特性 指令名称(参数1 参数2) 参数使用小括号包裹起来,参数之间使用空格或者分号隔开。...(hello main.cpp ${HELLO}) cmake指令的变量使用 ${变量} 的形式读取变量,但在 IF 逻辑判断中,直接输入变量名称即可,如上面示例代码中的 HELLO 2.2. cmake...: 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置 # 添加src子目录,src中需要有一个 CMakeLists.txt add_subdirectory(src) aux_source_directory...: 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表。...,调试时需要选择 debug set(CMAKE_BUILD_TYPE Debug) # 设定编译类型为release,发布时需要选择 release set(CMAKE_BUILD_TYPE Release
我们可以在项目中直接引入BareSIP的库,也可以将BareSIP的源代码引入到项目中,目前BareSIP还不是很稳定,因此,使用后者的方式方便我们对BareSIP进行二次开发以及修改问题。...下文会一步一步讲述如何在Android Studio中使用CMake编译BareSIP。...项目引入BareSIP 通过BareSIP官网可以了解到,在编译BareSIP时,必须先构建re、rem、openssl三个库。...CMake构建脚本) 先在根目录下的CMakeLists.txt引入子目录 cmake_minimum_required(VERSION 3.4.1) add_subdirectory(openssl...CMake构建脚本) 然后在编写每个子模块下的CMakeLists.txt openssl openssl源代码是Makefile方式构建,因此我们需要手动编写CMakeLists.txt cmake_minimum_required
采用自动化的项目构建工具cmake 可以将程序员从复杂的makefile 文件中解脱出来。...使用cmake 很简单,只需要执行cmake, make 两个命令即可,用我工作中的一个工程举例说明。 假设当前的项目代码在src 目录。...build —– 编译目录,存放编译生成的中间文件 cmake 要求工程主目录和所有存放源代码子目录下都要编写CMakeLists.txt 文件,注意大小写(cm 大写,list中...debug 版会生成相关调试信息,可以使用GDB 进行 调试;release不会生成调试信息。当无法进行调试时查看此处是否设置为debug. 5....ADD_SUBDIRECTORY(utility) 添加要编译的子目录 为工程主目录下的存放源代码的子目录使用该命令,各子目录出现的顺序随意。
内部构建和外部构建 上述例子就是内部构建,他生产的临时文件特别多,不方便清理 外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响强烈使用外部构建方式 外部构建方式举例 //例子目录...子目录 PS:tree命令在centos中没有,需要提前进行安装,安装命令:yum install tree 每个目录下都要有一个CMakeLists.txt说明 [root@localhost cmake...,如程序中的example ADD_SUBDIRECTORY(src bin) 将 src 子目录加入工程并指定编译输出(包含编译中间结果)路径为bin 目录 如果不进行 bin 目录的指定,那么编译结果...静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行 动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。...在构建一个新的target 时,会尝试清理掉其他使用这个名字的库,因为,在构建 libhello.so 时, 就会清理掉 libhello.a SET_TARGET_PROPERTIES(hello_static
外部构建,就会把生成的临时文件放在build目录下,不会对源文件有任何影响强烈使用外部构建方式 外部构建方式举例 //例子目录,CMakeLists.txt和上面例子一致 [root@localhost.../结尾:将这个目录中的内容安装到目标路径 安装过程 cmake .. make make install 静态库和动态库的构建 任务: 1,建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用...静态库在编译时会直接整合到目标程序中,编译成功的可执行文件可独立运行 动态库在编译时不会放到连接的目标程序中,即可执行文件无法单独运行。...<< std::endl; } 项目中的cmake内容 PROJECT(HELLO) ADD_SUBDIRECTORY(lib bin) lib中CMakeLists.txt中的内容 SET(LIBHELLO_SRC...在构建一个新的target 时,会尝试清理掉其他使用这个名字的库,因为,在构建 libhello.so 时, 就会清理掉 libhello.a SET_TARGET_PROPERTIES(hello_static
: 使用 预构建的二进制库和头文件 ; ② 编译源码 : 直接 添加 Oboe 源码到工程中 , 在 Android Studio 中编译 Oboe 源码 ; Oboe 导入库方案适用场景 : 使用稳定功能...源代码路径 : 这里 假设 Oboe 源代码在 CMakeLists.txt 构建脚本相同层级目录中 , 该操作相当于 设置了一个变量 ; set (OBOE_DIR ..../oboe) ② 将 Oboe 源码目录设置为工程的子路径 : add_subdirectory 告诉 CMake 到 OBOE_DIR 路径中查找该路径下的 CMakeLists.txt 构建脚本 ,...设置 Oboe 源代码路径 , 这里假设 Oboe 源代码在 CMakeLists.txt 构建脚本相同层级目录中 , 该操作相当于设置了一个变量 set (OBOE_DIR ....将 Oboe 源码目录设置为工程的子路径 , # add_subdirectory 告诉 CMake 到 OBOE_DIR 路径中查找该路径下的 CMakeLists.txt 构建脚本 , # 编译该构建脚本中指定的源码
(hello ${SRC_LIST}) 然后,建立一个任意目录(比如本目录下创建一个build子目录),在该build目录下调用cmake 注意:为了简单起见,我们从一开始就采用cmake的 out-of-source...方式来构建(即生成中间产物与源代码分离),并始终坚持这种方法,这也就是此处为什么单独创建一个目录,然后在该目录下执行 cmake 的原因 cmake .....要显示执行构建过程中详细的信息(比如为了得到更详细的出错信息),可以在CMakeList.txt内加入: SET( CMAKE_VERBOSE_MAKEFILE on ) 或者执行make时 $ make...add_subdirectory 告诉cmake去子目录寻找新的CMakeList.txt 子文件 在 src 的 CMakeList.txt 文件中,新增加了include_directories...(src bin) add_subdirectory(libhello lib) 不是build中的目录默认和源代码中结构一样么,我们可以指定其对应的目录在build中的名字。
我们的示例没有使用这些选项,因为“Hello, World”示例没有任何测试,但在第五章,将您的项目作为超级构建管理中,我们将触发测试步骤。...) FFTW 的依赖关系在external/upstream子目录中进行检查,我们继续将此子目录添加到构建系统中: add_subdirectory(external/upstream) 我们包含ExternalProject.cmake...虽然 Fortran 在处理数值数组时提供了非常自然的语法,但在与操作系统交互时却显得不足,主要是因为直到 Fortran 2003 标准发布时,才强制要求与 C 语言(计算机编程的事实上的通用语言)的互操作层...然而,我们不会将 pybind11 源代码明确放入我们的项目目录中,而是演示如何在配置时使用FetchContent(cmake.org/cmake/help/v3.11/module/FetchContent.html...解决此挑战的一种方法是使用FetchContent模块,该模块在配置时获取 pybind11 源代码和 CMake 基础设施,以便我们可以使用add_subdirectory引用它。
定义了 CMake 文件之后,就可以开始编译构建了。 CMake 在构建工程时会生成许多临时文件,避免让这些临时文件污染代码,一般会把它们放到一个单独的目录中。...操作步骤如下: # 在 cpp 目录下创建 build 目录 mkdir build # 调用 cmake 命令生成 makefile 文件 cmake .. # 编译 make 在 build 目录中可以找到最终生成的可执行文件...这就是 CMake 的一个简单操作,将 cpp 编译成可执行文件,但在 Android 中,大多数场景都是把 cpp 编译成库文件。...最后同样地执行构建,在 build 目录下可以看到生成的库文件。 到这里,就基本可以使用 CMake 来构建 C/C++ 工程了。...然后在当前库的 CMakeLists.txt 文件中通过 ADD_SUBDIRECTORY 将其他库的目录添加进来,这样才能够链接到。
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) aux_source_directory – 发现一个目录下所有的源代码文件并将列表存储在一个变量中...CMakeLists.txt通过add_subdirectory添加子目录即可; 包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中;...编译流程 在 linux 平台下使用 CMake 构建C/C++工程的流程如下: 手动编写 CmakeLists.txt。...# 表示上级目录 ../ # 表示上级目录 两种构建方式 内部构建(in-source build):不推荐使用 内部构建会在同级目录下产生一大堆中间文件,这些中间文件并不是我们最终所需要的...build):推荐使用 将编译输出文件与源文件放到不同目录中 ## 外部构建 # 1.
在CMake中,大小写、甚至大小写混合的命令都是被支持的。...为了使用新库,我们在顶层根目录中的CMakeLists.txt调用add_subdirectory,如此一来该库便建成了。...该值将存储在缓存文件中,用户不需要每次运行cmake指令时都对其进行一次设定。 # add the MathFunctions library?...,并在后面的代码中慢慢被链接到可执行文件;在维护大型工程时,通常有很多可选部分,为了保持工程的清晰,这是一种普遍用法。...在顶层根目录中的CMakeLists.txt中,我们可以添加几行简单测试代码来衡量应用是否正确。
按照muduo Github官网README中的说法, 只需要编译muduo库根目录下的build.sh可执行文件即可。...在muduo源代码所在目录执行build.sh脚本报错,错误信息如下图所示: ?...很是纳闷,估计是/usr/local/boost目录不是默认的安装目录所以会导致这个问题吧,最后找到了如下两篇博客: Linux下使用CMake进行编译的时候寻找Boost库 cmake使用boost库...可以看到在/root/GithubProjects/build目录下生成了release-cpp11目录,里面有如下目录和文件,包括可执行程序、lib、examples、muduo目录: ?..../ 上面4种方法中,我所熟悉的是第三种和第四种,这里我以cmake第三种为例: 注意:不论使用make还是cmake也好,注意:muduo库的路径需要根据自己编译后的路径为准。
但是该样例是基于VS进行编写构建的,而本人日常喜欢CLion进行C/C++开发,于是准备使用cmake重新组织该书籍的样例项目:2DGraphics1中的NimotsuKunBox和drawPixels...使用VS构建样例项目静态库 在GameLib下,本书的译者已经帮我们编写了一个基本的指南: 编译顺序 在系统环境变量中添加 GAME_LIB_DIR 值为源码工程的根目录 注意要重启visual...使用cmake搭建2DGraphics1项目 在经过前戏后,我们终于编译出了2DGraphics1所需要的GameLib_d.lib静态库以及相关的头文件,并且,我们还构建了2DGraphics1样例解决方案中的...一致的名称 ADD_SUBDIRECTORY(NimotsuKunBox) ADD_SUBDIRECTORY(drawPixels) 于是,当前整体目录结构如下: 2DGraphics1_cmake ├...其最初版本和GB 2312一模一样,但在推出Windows 95时扩展成GBK)。 在CMake中想要给msvc指定文件编码方式,需要在CMakeLists.txt配置如下内容: ... ...
具体的做法就是在cef_binary_xxx目录(后续都用该指代CEF binary distribution文件夹根目录)中创建一个名为build的目录,进入该目录后,针对不同的平台,使用CMake生成不同的构建系统的工程配置...由于我们在CMAKE_MODULE_PATH中追加了${CEF_ROOT}/cmake这个目录,即cef_binary_xxx/cmake目录,所以CMake会搜索这个目录,该目录确实存在FindCEF.cmake...中定义的: 也就是说,在本例中,add_subdirectory(${CEF_LIBCEF_DLL_WRAPPER_PATH} libcef_dll_wrapper)就是添加了子目录cef_binary_xxx...首先,cefsimple存放于cef_binary_xxx/tests/cefsimple目录中,在cef_binary_xxx/CMakeLists.txt中,同样通过add_subdirectory...(tests/gtest) add_subdirectory(tests/ceftests) endif() 这里之所以使用一个目录判断,目测是在CEF binary distribution的Minimal
: 表示库文件的名字 [STATIC | SHARED | MODULE] : 生成的库文件类型 STATIC 静态库,在链接其他目标时使用 SHARED 动态链接库,运行时加载 MODULE...不会被链接到其它目标中,但是可能会在运行时使用dlopen-系列的函数动态链接 例: # create lib , 在当前cmake 中 创建一个lib,名称为model_login,SHARED...向构建中添加子目录(子目录中可以包含另一个cMakeLists.txt)。...( ) 查找指定目录dir中所有源文件的名称,并将列表存储在提供的variable中 例: aux_source_directory(....指定在编译给定目标时要使用的包含目录 # 添加头文件的路径,以便查找到头文件 : add_library 创建的target名称 或者 add_executable 创建的target名称
在 Unix 类系统上是通用的,但在 Windows 则不行 2.需要准确地指明每个项目之间的依赖关系,有头文件时特别头疼 3.make 的语法非常简单,不像 shell 或 python 可以做很多判断等...只需要写一份 CMakeLists.txt,他就能够在调用时生成当前系统所支持的构建系统 CMake 可以自动检测源文件和头文件之间的依赖关系,导出到 Makefile 里 CMake 具有相对高级的语法...libtest.a 其中 PUBLIC 的含义稍后会说明(CMake 中有很多这样的大写修饰符) 4.CMake中的子模块 复杂的工程中,我们需要划分子模块,通常一个库一个目录,比如: 这里我们把 hellolib...库的东西移到 hellolib 文件夹下了,里面的 CMakeLists.txt 定义了 hellolib 的生成规则 要在根目录使用他,可以用 CMake 的 add_subdirectory 添加子目录...,子目录也包含一个 CMakeLists.txt,其中定义的库在 add_subdirectory 之后就可以在外面使用 子目录的 CMakeLists.txt 里路径名(比如 hello.cpp)都是相对路径
/main/cpp/librtmp 目录下的构建脚本 add_subdirectory(librtmp) add_library( # 函数库名称 native-lib..., 执行了 9 个步骤 , 第 1 ~ 6 步骤 : 开始构建时 , 指定第一行编译脚本内容 , add_subdirectory(librtmp) , 编译 librtmp 目录下的 CMakeList.txt...内容 ; # 链接 src/main/cpp/librtmp 目录下的构建脚本 add_subdirectory(librtmp) 编译 RTMP 源代码 , 该步骤执行下面的构建脚本 , 编译 librtmp.so...; x264 开源库编译过程 : x264 开源库的头文件放在 include 目录中 , 交叉编译的函数库放在 libs/armeabi-v7a 目录中 ; # 设置头文件搜索路径 include_directories...( 正确构建脚本 ) : cmake_minimum_required(VERSION 3.4.1) # 链接 src/main/cpp/librtmp 目录下的构建脚本 add_subdirectory
首先,新建一个目录,创建MakeList.txt /home/code/test/build PROJECT(HELLOLIB) # 通过在主工程文件CMakeLists.txt中修改ADD_SUBDIRECTORY...(lib) 指令来指定一个编译输出位置; # 指定本工程中静态库libhello.so生成的位置,即 build/lib; ADD_SUBDIRECTORY(lib) 在lib目录下建立两个源文件...在构建一个新的target时,会尝试清理掉其他使用这个名字的库, # 因此,在构建libhello.a时,就会清理掉libhello.so...,才能真正让其他人开发使用, # 在本例中我们将hello的共享库安装到/lib目录; # 将hello.h安装/include/hello目录。...目录中 cmake ..
领取专属 10元无门槛券
手把手带您无忧上云