CMake:如何最好地构建多个(可选)子项目?

2024-05-20

想象一个包含多个组件的整体项目:

  • basic
  • io
  • web
  • app-a
  • app-b
  • app-c

现在,假设 web 依赖于 io,而 io 又依赖于 basic,所有这些东西都在一个存储库中,并且有一个 CMakeLists.txt 将它们构建为共享库。

如果这三个应用程序都是可选的并且在构建时可能不存在,我应该如何设置才能构建这三个应用程序?

一个想法是在主存储库中有一个空的“apps”目录,我们可以将我们想要的任何应用程序存储库克隆到其中。我们的主 CMakeLists.txt 文件可以使用 GLOB 查找所有应用程序目录并构建它们(事先不知道会有多少个)。这种方法的问题包括:

  • 显然,当你说时,CMake 不会重新全局化make,所以如果您添加新应用程序,您必须运行cmake again.
  • 它为构建人员强加了特定的结构。
  • 目前尚不清楚如何对单个应用程序进行两个克隆,并针对同一个库构建分别构建它们。

一般概念就像传统的递归 CMake 项目,但较低级别的模块不一定提前知道哪些较高级别的模块将使用它们。然而,我不想要求用户将较低级别的库安装在固定位置(例如/usr/local/lib)。但是我确实想要一次调用make注意到整个项目中依赖关系的变化,这样如果我正在构建一个应用程序但更改了其中一个低级库,所有内容都会适当地重新编译。


我的第一个想法是使用 CMake导入/导出目标特征。

有一个 CMakeLists.txtbasic, io and web和一个引用这些内容的 CMakeLists.txt。然后你可以使用 CMakeexport导出这些目标的功能,然后应用程序项目可以importCMake 目标。

当您首先构建库项目时,应用程序项目应该能够自动找到已编译的库(无需将库安装到/usr/local/lib),否则始终可以设置正确的 CMake 变量来指示正确的目录。

当这样做时make在应用程序项目中不会做make在图书馆项目中,您必须自己处理这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake:如何最好地构建多个(可选)子项目? 的相关文章

  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 使用星号更改多个源文件的 CMake 编译器标志

    我正在尝试调试与编译器优化相关的问题 O2 或以下版本没有问题 O3 出现段错误 并且我希望能够切换我的源代码块的编译器标志 以便我可以尝试缩小段错误的来源范围 我可以将全局优化级别设置为 O2 并更改单个文件的属性 如下所示 SET SO
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • .NET 世界有 Maven 替代方案或端口吗?

    NET 世界有 Maven 替代方案或端口吗 我很想使用 Java 世界拥有的良好依赖管理系统 但我没有找到任何可与 NET 项目相媲美的系统 NMaven http incubator apache org nmaven 是第一个 官方努
  • 如何在Linux上构建GLFW3项目?

    我已经使用 cmake 和 make 编译了 glfw3 和包含的示例 没有出现任何问题 开始编写我的第一个项目 作为 opengl 和 glfw 的新手 并且对 C 和 CMake 没有经验 我正在努力理解示例构建文件 甚至要链接哪些库和
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • .dylib动态链接库可以打包成可执行文件吗?

    是的 我知道 dylib 的全部意义在于它动态加载 但我正在尝试创建一个独立的包 我有一个从命令行构建的可执行文件 在 macOS Lion 上 如果重要的话 我将可执行文件交付给朋友 但他无法运行它 因为他没有安装库 他宁愿not安装库
  • 使用cmake交叉编译gRPC

    我正在尝试使用 cmake 交叉编译 gRPC 我实际上做到了 不幸的是 我的方法涉及在 CMakeLists txt 内部进行修改 问题是 当我尝试编译 gRPC 时 它使用的是他刚刚编译的 protobuffer 它无法在 x86 计算
  • Clion如何将文件添加到项目中

    这看起来真的很基本 如何将文件添加到项目中而无需手动编辑CMakeLists txt 例如另一个目录中的源文件 CLion 解析CMakeLists txt并使用它生成项目视图 但我相信将文件添加到项目的唯一方法是编辑CMakeLists
  • 评估指令时出现 Proguard 错误

    我将我的android项目升级到24 SDK版本 但是我在构建的 Proguard 路径中遇到错误 Unexpected error while evaluating instruction Class com google android
  • CMake 错误:“add_subdirectory 未给出二进制目录”

    我正在尝试将 Google Test 集成到更大项目的子项目中 但找不到令我满意的解决方案 我有两个限制 Google Test 的源代码已经位于项目结构中的某个位置 因此不能使用 URL 从 git 存储库下载它 Google Test
  • CMake 添加对安装目标的依赖

    我在使用cmake时遇到以下问题 我使用 UseDoxygen 来自http tobias rautenkranz ch cmake doxygen http tobias rautenkranz ch cmake doxygen 为我的图
  • CMake、Exe找不到DLL

    所以我尝试在 Windows 上使用 cmake 设置一个项目 这就是我的项目结构 游戏引擎 git build include source testing CMakeLists txt 这个想法是 source 目录包含 GameEng
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • create-react-app 之后 React npm start 不起作用

    我正在学习 React 而且我的英语很差 我已经有两个反应项目 但它们也不起作用 我按照以下步骤操作 npx 创建反应应用程序我的应用程序 cd 我的应用程序 npm 启动 但它不起作用 我尝试清理缓存并再次安装 npm 但没有成功 我该如
  • 使用 CLion IDE 运行 Opengl 程序 [重复]

    这个问题在这里已经有答案了 我知道这个问题已经被问过 但提供的解决方案确实对我不起作用 我想通过 CLion IDE 运行我的 OpenGL 程序 我可以通过 Ubuntu 中的终端运行相同的程序 gcc progname c lglut
  • CMake GUI:指定 Windows 的库路径

    我正在编译一个基于 CMake 的项目 具体来说是 SOCI 它依赖于 SQLite 这是Windows 没有可供项目研究的标准路径 因此它找不到SQLite 我在配置时得到这个 SQLite3 not found some librari
  • CMake:Fortran 模块和编译顺序

    我有一个大型 Fortran 程序 其中包含许多目录 每个目录都在伪库中单独编译 但仍然存在相互依赖的混乱 因此最终所有伪库都组合在一个可用的库中 我想使用 Fortran 模块 但它非常脆弱 因为我不能依赖自动依赖项检查 并且根据顺序编译
  • Visual Studio:如何正确构建和指定 x64 和 x86 的配置和平台

    使用 Visual Studio 2012 Professional 和 Ultimate 以及所有最新更新 如何正确指定配置和平台以正确构建 x86 和 x64 当您第一次创建 Winforms 应用程序时 Visual Studio 会
  • Github 操作测试之前是否进行了包含特定单词的提交

    我需要确保使用 github 操作进行测试 如果之前已进行包含该单词的提交build 如果提交不包含单词build那么不应运行 github 操作的测试 你能给我一些建议吗 Test name Testing on push branche

随机推荐

  • 使用 awk 读取文件并搜索另一个文件

    我正在读取一个文件 每行都有数字 我需要搜索另一个满足这些数字和其他条件的文件 我正在尝试使用 awk 来做到这一点 但遇到了问题 File a txt 1476 1477 1497 现在我需要打印第 12 列包含这些数字的行以及第 3 列
  • django post_save 信号和 ManyToManyField (和 Django Admin)

    我的 post save 函数有问题 该函数已正确触发 但实例不包含插入的值 我用ipdb检查了该功能 没有任何问题 只是 ManyToManyField 是空的 代码 receiver post save sender Supplier
  • 处理大数据二进制文件

    我正在处理包含原始数据的大型二进制文件 每个大约 2 GB 这些文件具有明确定义的结构 其中每个文件都是一个数组events 每个事件都是一个数组data banks Each event and data bank有一个结构 header
  • 如何在Vue.js中格式化当前日期格式

    我需要获取当前日期Vue js 为此 我使用了以下方法 today date new Date toJSON slice 0 10 replace g today date将给出日期2019 09 11格式 有什么方法可以自定义这种格式吗
  • 如何从 C++ 中的文件中读取双精度值

    如何从 C 中的文件中读取 double 值 对于整数 我知道您可以使用 getline 然后使用 atoi 但我没有找到双倍函数的数组 什么可用于读取双精度数或将 char 数组转换为双精度数 您可以使用流提取 std ifstream
  • 从 UNIX 命令行向串行端口发送字节?

    我想使用命令行将字节流发送到串行端口 这可能吗 我的串口位于 dev cu usbserial A700dYoR在我的 Mac 上 例如 如果我想将整数 50 或字符串 data 发送到该串行端口 我该怎么做 我对 UNIX 的了解非常有限
  • 如何在 Windows 上的 Eclipse 中设置 Clang 工具链?

    我为一个愚蠢的问题道歉 但我在网上找不到答案 我正在努力为 64 位计算机上的 Windows 7 中的 Eclipse 设置 Clang 编译器 链接器 我对 C 的了解非常过时 并且从未在 Eclipse 中工作过 我想要实现的是在 W
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 在 AlpineLinux 上使用使用 glibc 的共享库

    我正在开发 AlpineLinux 安装在我的计算机上 而不是安装在 docker 中 并且我正在尝试使用依赖于 glibc 的共享库 由于 Glibc 没有集成到这个发行版中 我看到了一个替代方案 gcompat 旨在提供与为 Glibc
  • Microsoft SAPI 是否像 system.speech api 一样支持离线模式下的语音识别?

    我已经阅读了Microsoft SAPI的官方文档 但我找不到该API是否可以在离线模式下使用 in there https stackoverflow com a 2982910 4606266 他们说微软SAPI是基于服务器的语音识别A
  • 如何在不实现视图的情况下处理草书事件

    我正在编写一个应用程序cursive https docs rs cursive 0 16 3 cursive GUI 我想当用户按下某些键时执行某些操作 例如 当使用表格视图 https docs rs cursive table vie
  • Android 完整备份:“file.xml 不在包含路径中”

    我已经创建了备份规则文件 就像示例中一样https developer android com guide topics data autobackup https developer android com guide topics da
  • Sharepoint Web 部件列表组合框

    我有一个可以在列表中工作的 Web 部件 但我想要创建一个包含共享点列表列表的下拉列表 以便当用户编辑页面并选择 修改共享 Web 部件 时 他们可以选择一个列表item 并被解析回 web 部件 任何示例或示例链接表示赞赏 Thanks
  • 合并 JavaScript 数组中的重复项

    我有一个愚蠢的问题 乍一看似乎很容易解决 但结果却很棘手 我有一个对象数组 每个对象都有两个属性 id 和 value id 2 value 10 id 4 value 3 id 2 value 2 id 1 value 15 我想编写一个
  • mysql 不带空字符串和 NULL 的不同值

    如何检索没有空字符串值和NULL值的mysql不同值 SELECT DISTINCT CON EMAILADDRESS AS E MAIL FROM STUDENT INNER JOIN CONTACT CON ON STUDENT CON
  • 带有可选文本的 python tkinter 弹出窗口

    我想使用 Tkinter 制作弹出窗口 我可以这样做 import Tkinter a some data that use should be able to copy paste tkMessageBox showwarning don
  • 自上次触摸起 60 秒后开始 ViewFlipper 翻转

    我的应用程序包含一个ViewFlipper与一些图像 当应用程序启动时 ViewFlipper startflipping 当用户触摸屏幕时ViewFlipper stopflipping 我必须在上次触摸后 60 秒后执行此操作 View
  • SQL查询json字典数据

    我的表中的 CLOB 字段包含 JSON 如下所示 a value1 b value2 c value3 我正在尝试编写一个 SQL 查询来返回一个包含键和值字段的表 如下所示 key value a value1 b value2 c v
  • '回应?'与“定义?”

    如果我想检查是否定义了给定名称的方法 使用哪个更好 respond to or defined 从效率的角度来看 可以有理由使用defined 因为defined 是一个内置关键字 而respond to 是一种方法 因此前者可能更快 但另
  • CMake:如何最好地构建多个(可选)子项目?

    想象一个包含多个组件的整体项目 basic io web app a app b app c 现在 假设 web 依赖于 io 而 io 又依赖于 basic 所有这些东西都在一个存储库中 并且有一个 CMakeLists txt 将它们构