首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CMake在目录中构建,但在使用add_subdirectory时不会

基础概念

CMake是一个跨平台的开源构建系统生成器,用于自动化软件的编译、测试和打包过程。它使用名为CMakeLists.txt的配置文件来描述构建过程。add_subdirectory命令允许你在主项目的构建过程中包含一个子目录,该子目录也包含自己的CMakeLists.txt文件。

相关优势

  • 跨平台:CMake支持多种操作系统和编译器,使得项目可以在不同环境中轻松构建。
  • 模块化:通过add_subdirectory,可以将大型项目分解为多个模块,每个模块可以独立管理。
  • 灵活性:CMake提供了丰富的命令和选项,可以灵活地控制构建过程。

类型

  • 内部子目录:子目录位于主项目的源码树中。
  • 外部子目录:子目录位于主项目的源码树之外,通常用于第三方库。

应用场景

  • 大型项目:将项目分解为多个模块,每个模块可以独立开发和测试。
  • 第三方库集成:将第三方库的构建过程集成到主项目中。

常见问题及解决方法

问题:使用add_subdirectory时不会构建子目录

原因

  1. 子目录中没有CMakeLists.txt文件add_subdirectory命令依赖于子目录中的CMakeLists.txt文件来执行构建。
  2. 路径错误:指定的子目录路径不正确。
  3. 构建顺序问题:子目录的构建依赖于其他目录,但构建顺序不正确。

解决方法

  1. 确保子目录中有CMakeLists.txt文件
  2. 确保子目录中有CMakeLists.txt文件
  3. 检查路径
  4. 检查路径
  5. 调整构建顺序
  6. 调整构建顺序

示例代码

假设你有一个主项目目录结构如下:

代码语言:txt
复制
project/
├── CMakeLists.txt
└── subdirectory/
    └── CMakeLists.txt

主项目的CMakeLists.txt文件内容:

代码语言:txt
复制
cmake_minimum_required(VERSION 3.10)
project(MyProject)

add_subdirectory(subdirectory)

子目录的CMakeLists.txt文件内容:

代码语言:txt
复制
cmake_minimum_required(VERSION 3.10)
project(SubDirectory)

add_executable(myexe main.cpp)

参考链接

通过以上步骤,你应该能够解决add_subdirectory不构建子目录的问题。如果问题仍然存在,请检查CMake的输出日志,通常会提供详细的错误信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

跨平台编译工具-CMake的语法特性与常用变量

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

1.2K10
  • CmakeList的编写和参数详解

    采用自动化的项目构建工具cmake 可以将程序员从复杂的makefile 文件中解脱出来。...使用cmake 很简单,只需要执行cmake, make 两个命令即可,用我工作中的一个工程举例说明。 假设当前的项目代码在src 目录。...build —– 编译目录,存放编译生成的中间文件 cmake 要求工程主目录和所有存放源代码子目录下都要编写CMakeLists.txt 文件,注意大小写(cm 大写,list中...debug 版会生成相关调试信息,可以使用GDB 进行 调试;release不会生成调试信息。当无法进行调试时查看此处是否设置为debug. 5....ADD_SUBDIRECTORY(utility) 添加要编译的子目录 为工程主目录下的存放源代码的子目录使用该命令,各子目录出现的顺序随意。

    2.2K50

    用Android Studio编译BareSIP

    我们可以在项目中直接引入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

    1.6K10

    CMake学习笔记合集

    内部构建和外部构建 上述例子就是内部构建,他生产的临时文件特别多,不方便清理 外部构建,就会把生成的临时文件放在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

    2.2K20

    CMake学习笔记

    外部构建,就会把生成的临时文件放在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

    2.1K20

    用Visual Studio Code和CLion进行EOS开发

    每个目录都有自己的带有命令的CMakeLists.txt文件。 可以在我们的repo中找到所有的文件夹和脚本的新项目结构。 CMakeLists 让我们看一些配置文件,因为你需要知道如何使用它们。...每一个新的智能合约都应该作为这个配置中的子目录来添加。重要的是不要忘了这一步合约不会编译。CMake不知道。...} ) 现在,当我们有了新的项目结构时,我们必须定制命令来编译和构建我们所做的每一件事。...当你仍然在VS代码中时,点击Preferences – Keyboard Shortcuts。快捷方式窗口找到并打开keybindings.json(它在顶部): ?...当加载CLion中的架构时,IDE会自动在cmake-build-debug文件夹中创建所有生成文件。一旦准备就绪,就可以使用“⌘+F9”快捷方式执行实际构建。这就是你需要做的一切,太简单了吧?

    2K20

    成为Oceanbase贡献者(2):源码解读build.sh debug --make 的执行过程

    使用 add_subdirectory(): 如果你的多个项目是相互关联并且存放在同一个大的源代码仓库中,你可以直接在主项目的 CMakeLists.txt 中使用 add_subdirectory()...使用 CMake 构建项目完成上述两步后,你就可以使用 CMake 来构建你的项目了。以下是构建步骤:打开命令行界面,导航到包含 CMakeLists.txt 和 main.cpp 文件的目录。...)# 包含环境配置include(cmake/Env.cmake)# 添加子目录add_subdirectory(src)add_subdirectory(deps/oblib/src/lib)Env.cmake...(FATAL_ERROR "can't find suitable compiler")endif()标准库区别:在使用 C++ 编译器(如 GCC 和 Clang)时,-std=gnu++11 和 -...不包含 GNU 扩展:编译器不会启用任何 GNU 特定的扩展。可移植性更好:由于不包含 GNU 扩展,代码更容易在不同编译器之间移植。

    4700

    【Android 高性能音频】Oboe 开发流程 ( 导入 Oboe 库 | 使用预构建的二进制库和头文件 | 编译 Oboe 源码 )

    : 使用 预构建的二进制库和头文件 ; ② 编译源码 : 直接 添加 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 构建脚本 , # 编译该构建脚本中指定的源码

    1.1K00

    cmake 学习笔记(一)

    (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中的名字。

    54010

    CMake 秘籍(五)

    我们的示例没有使用这些选项,因为“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引用它。

    73120

    OpenHarmony开源三方库的cmake在IDE上直接引用的问题

    前言DevEco Studio的native工程的C/C++部分当前只支持cmake脚本的编译,工程的目录结构如下图所示在工程中引用第三方库有如下三种方式,一、find_package模式通过find_package...,可以在指定目录下去搜索已安装的库(三方库构建完后执行install,会生成xxx-config.cmake之类的文件在安装目录下),如果可以找到对应的库,就可以获取头文件路径以及库的路径二、add_subdirectory...模式可以通过顶层CMakeLists.txt调用子目录CMakeLists.txt的方式,这样就可以直接引用到第三方库的头文件路径和库三、target_link_libraries模式在库链接时直接链接第三方库背景...DevEco Studio的native工程的C/C++部分是使用的cmake脚本来构建,开源社区上有很多C/C++三方库也是使用cmake来编译构建,这些三方库我们是否可以直接采用add_subdirectory...上直接使用需要配置搜索路径和提前将依赖的库都构建并安装完毕或者在顶层CMakeLists.txt中使用execute_process来调用shell命令,先把依赖库编译并安装完成三方库引用的建议在native

    12910

    Cmake的使用

    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.

    1.4K31

    Android NDK 开发之 CMake 必知必会

    定义了 CMake 文件之后,就可以开始编译构建了。 CMake 在构建工程时会生成许多临时文件,避免让这些临时文件污染代码,一般会把它们放到一个单独的目录中。...操作步骤如下: # 在 cpp 目录下创建 build 目录 mkdir build # 调用 cmake 命令生成 makefile 文件 cmake .. # 编译 make 在 build 目录中可以找到最终生成的可执行文件...这就是 CMake 的一个简单操作,将 cpp 编译成可执行文件,但在 Android 中,大多数场景都是把 cpp 编译成库文件。...最后同样地执行构建,在 build 目录下可以看到生成的库文件。 到这里,就基本可以使用 CMake 来构建 C/C++ 工程了。...然后在当前库的 CMakeLists.txt 文件中通过 ADD_SUBDIRECTORY 将其他库的目录添加进来,这样才能够链接到。

    1.5K20

    CentOS7.8下编译muduo库找不到Boost库报错的解决方法

    按照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库的路径需要根据自己编译后的路径为准。

    1.9K20

    使用CEF(六)— 解读CEF的cmake工程配置

    具体的做法就是在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

    97220

    【错误记录】Android NDK 错误排查记录 ( error: undefined reference to | Linking CXX shared library FAILED )

    /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

    1.9K10

    星球专享 | 播放器 FFmpeg 依赖库的配置

    项目根目录是作为 SDK 的目录,而 demo 是在根目录下的子目录中,同时 demo 依赖根目录 SDK 的编译结果,这种项目配置在一些开源项目中还是很常见的。...当用 CLion 打开工程时如果选择了根目录下的 CMakeLists.txt 就是 SDK 工程了,选择了 demo 目录下的就是播放器项目了,差别就是在 CLion 中能否有 PlanetPlayerDemo...这个构建,如下图所示: 选择 SDK 工程打开方式时就只有 2 和 3 的选项了,其中 2 是 SDK 的构建,3 是单测的构建,而 1 是播放器打开方式才有的,前期很多时候都只要 SDK 打开方式就行了...我们的播放器项目就是在 Mac 上运行的,所以完全可以直接用 brew 安装好的 ffmpeg 库。 如上命令,在 finder 中打开 ffmpeg 的安装目录。...有了这两个方法,在 SDK 工程和播放器工程都可以复用了。 接下来在 SDK 工程中的配置就和平常配置一样了,依赖好 ffmpeg 的库。

    61420
    领券