- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 CMake 中处理这种编译情况?假设我们有一个包含如下子目录的源代码目录
src:
helper:
innerpkg:
a.cpp
a.h
helper.cpp
helper.h
main.cpp
main.h
文件 a.cpp 调用文件 helper.cpp 中的内容,尽管 helper.cpp 可能不会调用 a.cpp 中的任何内容。因此,如果我们将 helper 子目录设为一个库,并将 innerpkg 设为一个库,我们就会遇到一个问题,即 helper 需要包含 innerpkg,但 innerpkg 也需要 helper —— 一个循环依赖项。处理这个问题的正确方法是什么,并且仍然在 helper 中保留一些源文件?顺便说一句,我对使用 CMake 还很陌生。
编辑:innerpkg 中的 CMakeLists.txt 文件可能如下所示:
include_directories(${CCMBS_SOURCE_DIR})
set(INNERPKG_SRC a.cpp)
add_library(innerpkg ${INNKERPKG_SRC})
在助手中:
include_directories(${PROJ_SOURCE_DIR})
add_subdirectory(innerpkg)
set(HELPER_SRC helper.cpp)
add_library(helper ${HELPER_SRC})
target_link_libraries(ui "-Wl,--whole-archive")
target_link_libraries(ui innerpkg)
target_link_libraries(ui "-Wl,--no-whole-archive")
如果这有帮助。需要如何设置才能解决这个问题?
编辑:确切的依赖结构是这样的:innerpkg 中的内容依赖于 helper 中的内容。 innerpkg 由 main 使用。另一种情况是 helper 也依赖 innerpkg 中的东西,即循环依赖,而 main 使用 helper 或 innerpkg。
最佳答案
我觉得您假设基于 CMake 的项目中的每个目录都必须包含自己的 CMakeLists.txt 文件并构建自己的库/可执行文件。
这个问题其实和CMake没有关系。几乎所有构建系统都会遇到同样的问题。这里的问题是你的依赖树不清楚。应不惜一切代价避免循环依赖。
与 Java 及其基于包的系统相反,C++ 应用程序没有强制执行目录布局,甚至 CMake 也没有。
依赖关系只能用库和可执行程序来表示,前者主要用于避免在使用相同功能的不同程序之间重复代码。
在您的具体情况下,不清楚谁在使用 helper
和 innerpkg
库。因此,让我们做出几个假设。
那么拥有单独的库是非常有意义的,除了将它们表示为平面目录结构要好得多,以便清楚地分离每个库和程序。
src
├─ helper
│ ├─ helper.cpp
│ └─ helper.h
├─ innerpkg
│ ├─ a.cpp
│ └─ a.h
├─ main
│ ├─ main.cpp
│ └─ main.h
└─ main2
├─ main2.cpp
└─ main2.h
显然,既然你是说 helper.cpp 不需要调用 a.cpp 中定义的东西,那么 helper
库不依赖于 innerpkg
, 因此不存在循环依赖。
在 CMake 方面,每个目录(包括根目录)中将有一个 CMakeLists.txt 文件,总共有五个。
最上面的一个将只包含每个子目录,而其余四个将负责构建每个二进制文件。只有 main
和 main2
中的 CMake 列表会实际调用 target_link_libraries()
。
那你为什么首先需要库?
由于只有一个可执行程序main
,所以没有重复的代码和功能。
在这种情况下,解决方案是保留您当前的目录结构,其中子目录不是库而是主题。
我所说的主题是指最终程序功能的一个子集,为了便于维护而明确分开,但它不暗示与其他主题的依赖关系。
在那种情况下为什么不关心依赖关系?仅仅是因为您不需要创建库。只需将每个 cpp 文件添加为 main
程序的源,这样依赖关系就会在链接时一次性自动解决。
对于 CMake,您只需要在顶部有一个 CMakeLists.txt 文件,它只会构建一个程序并列出每个子目录中的每个 cpp 文件,如下所示:
add_executable(main
main.cpp
helper/helper.cpp
helper/innerpkg/a.cpp
)
这还假设您确实需要生成一个库,它将成为项目安装部分的一部分,以便第三方应用程序使用。
在这种情况下,通过使helper
和innerpkg
成为唯一一个库来解决循环依赖问题。
然后你应该有一个如下所示的目录结构:
src
├─ helper
│ ├─ helper.cpp
│ ├─ helper.h
│ └─ innerpkg
│ ├─ a.cpp
│ └─ a.h
└─ main
├─ main.cpp
└─ main.h
与上一点一样,helper
下的目录结构没有隐含依赖关系,因为只会编译一个库。
此外,即使 main
使用 innerpkg
的功能,它也只是作为 helper
的一部分透明公开。
就 CMake 而言,您将拥有一个包含两个子目录的顶级 CMakeLists.txt,一个在 helper
中列出 helper 和 innerpkg 中的每个 cpp 文件以构建库,一个在 main
列出 main 中的每个文件,并与帮助程序库链接。
关于CMake 和子目录取决于父目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21153584/
有没有办法为我的一些文件创建一个子目录?这纯粹是为了文件组织。我有大量的小结构/方法,我想将它们放入它们自己的文件和子目录中,但我不想将它们放入它们自己的包中。他们依赖于我项目中的其他功能。每一个都在
我想将目录中的文件和文件夹复制到另一个文件夹中,但不包含包含该文件的子文件夹,例如,对于node_modules目录,我有大量文件,例如100Mb和50K +个文件,不需要复制。 我试过这样使用xco
嘿,我想安装一个论坛(xenforo),我已经得到了所有的 .php 文件,我把文件夹放在/usr/share/nginx/html 页面在哪里(主页 index.html),但是当我做 127.0.
我想在我的 Symfony2 应用程序的子目录中隔离一些 Controller 。 像这样的东西: route: resource: "@MyBundle/Controller/Admin/"
我们有一个由离岸外包开发公司开发的旧应用程序,它仍在使用 Azure 存储客户端 1.7。 因此,我会在此版本停止工作之前对其进行更新。 有一个单元测试我无法通过。 [TestMethod()
我已将 WordPress 安装在子目录中: /public_html/blog/ 我希望能够像这样访问博客: http://example.com/blog 以及类似这样的帖子: http://ex
我正在尝试制作一个程序来将特定文件夹中的文件以及主文件夹的子文件夹中的文件备份到另一个备份文件夹。 这是我试图实现目标的代码的一部分,但是我只备份了主文件夹中的文件,而子文件夹正在被完全复制(其中的所
我无法在 NSTemporaryDirectory 子文件夹中存储任何文件 rootDirectoryName 是 GUIDsubDirectoryName 也是一个 GUID self.rootFo
我最近正在制作一些 Java 软件来查找文件夹中的一些文件/目录,如果它们的名称包含某些文本,它们将被重命名为其他名称。我使用 Files.walkFileTree 遍历目录,如果找到一个匹配的文件/
我一直在互联网深处搜索,试图让 HAProxy 正常运行,但我不确定它能否完成我想要的。 我试着按照这个:https://www.haproxy.com/blog/howto-write-apache
我正在尝试查找其中包含最多文件的目录。我知道我可以使用以下方法找到文件数: find -maxdepth 5 -type f | wc -l 但这只有在我知道要检查哪个目录时才有用。我想找到包含最多文
我正在尝试按如下方式组织我的项目目录 外壳 |inc/[头文件] |obj/[目标文件] |src/[源文件] |生成文件 |可执行 根文件夹中的所有内容都可以正常编译,但我在修改我的 makefil
当我在谷歌上搜索 yahoo、godaddy 等时,它们会显示子目录,如附图所示。但是当我在谷歌上找到我的网站时,它并没有显示那种东西。问题是什么? 最佳答案 有机 SERP 部分的 Google 附
我有一个名为“myproject”的项目,它由 git 进行版本控制。它有一个名为“data”的子目录,该目录已被 gitignored。 我可以为数据目录“git init”并将其作为单独的 git
我有一个目录位置,如何创建所有目录?例如C:\Match\Upload 将同时创建 Match 和子目录 Upload(如果不存在)。 使用 C# 3.0 谢谢 最佳答案 Directory.Crea
如何在 C++ 中删除包含所有文件/子目录的文件夹(递归删除)? 最佳答案 说真的: system("rm -rf /path/to/directory") 也许更多您正在寻找的东西,但特定于 uni
在我正在处理的当前项目中,有人决定将二进制文件作为源树的一部分 checkin 。二进制文件位于源代码下方的目录中: project/src # Here is the loc
我最近知道了 meteor 私有(private)子目录。根据文档:“私有(private)子目录是服务器代码可以访问但不提供给客户端的任何文件的位置,例如私有(private)数据文件。”一般来说,
我的存储库中有多个项目(子目录)。所有项目都只有一个名为main.cpp的可执行文件,并且它们都使用common语句中的#include文件夹中的库。文件夹结构如下所示: root | ├────co
如何在 C# 中搜索这样的路径: "C:\MyApp\*\日志" 我想获取与该搜索模式匹配的所有目录。 示例结果: C:\MyApp\20171009\日志 C:\MyApp\20171008\日志
我是一名优秀的程序员,十分优秀!