- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一个 C++ 项目。到目前为止它并不复杂,但取决于一堆“流行”库(nlohmann/json、ToruNiina/toml11 仅举几例)。他们都有一些CMakeLists.txt
从我经验不足的角度来看,我认为它们结构良好。
现在当然我可以一个一个地编译库,或者在我的项目存储库中包含一个“拷贝”,但我想做得更好。在研究了可用的构建工具后,我决定使用 cmake
构建和管理 C++ 项目。 promise 是获得一个稳定的、广泛支持的工具,这将有助于简化和统一构建过程。而且,从项目性质上我没有特权对目标机器强加任何要求;我需要为部署打包所有东西。
我花了几天时间阅读、观看和测试各种 cmake 教程、手册和手册。我不得不承认,我很快开始觉得,一个应该澄清开发过程的工具不断引入新的晦涩之处,与其目的背道而驰。本来,我认为这是因为我缺乏经验,然而......
我读了 articles关于为什么不捆绑依赖,后面只有 methods of doing so .我发现建议使用一种方式 A 超过 B,C 超过 B,然后 A 超过 C。我花了一段时间才弄清楚 2.8 和 3.0 之间的差异,obscurity的 target_link_libraries
, 设置 cxx 版本和/或编译器警告标志等。
我的观点是,即使在对 cmake
的海洋进行了令人筋疲力尽的探险之后,我仍然不确定一些基本问题:
How is cmake meant to be used?
What is a standard, what is a courtesy, and what is none of those?
How can I tell that something is a feature, an archaic backwards compatibility, or both?
cmake_minimum_required(VERSION 3.14)
project(CaseCore CXX)
add_executable(myBinary list/of/cpp/sources.cpp)
target_link_libraries(myBinary PUBLIC someExternalLibs likeForExample nlohmann_json::nlohmann_json oqs)
唯一的问题是库(反正没有其他问题的空间)。我想用项目构建它们并且不想制作本地拷贝(不要一直拖着大量不相关的文件)。首先,我创建了库 repos 的分支,以便拥有可靠的来源并能够将较新的版本合并到我的分支中。
git submodule
或其他一些方案,我读过 submodule 表现不佳,并且更喜欢由
cmake
管理整个事情独自的。我从 ExternalProject_Add 开始,但后来我发现了
FetchContent
这帮助我轻松地将外部依赖项添加到我的 cmake 列表中
FetchContent_Declare(nlohmann
GIT_REPOSITORY https://github.com/my-reliable-fork-of/json
GIT_TAG v3.7.3
)
message(STATUS "Fetching Json...this may take a while")
FetchContent_MakeAvailable(nlohmann)
看起来和工作得很好而且很小。但是,我总是必须搜索图书馆本身才能找到/猜测
哪个目标链接到我的可执行目标 ?似乎有接近于零的约定,除非各自的
CMakeLists.txt
读起来很简单,我倾向于猜测目标名称,直到找到为止。
#include "oqs/oqs.h"
,但未创建动态库并终止执行。我很确定我可以在另一段时间花费谷歌搜索和玩弄各种 cmake 变量后解决问题。然而这不是我所期望的方式
cmake
帮助我管理我的项目;实际上恰恰相反。
add_subdirectory from local repo copy (git submodule)
ExternalProject_Add from local repo copy (git submodule)
ExternalProject_Add from online repo
find_package
因为它们似乎更加晦涩/老式等(尽管经过数小时的研究,它们似乎仍然与对我做同样事情的多种方法一样多)
Am I doing something wrong, or is it really what working with
cmake
should look like?Do I really have to "reverse-engineer" other people's CMakeLists in order to use a library?
Under these circumstances, how can I convince my coworkers to use similar work process?
How can I adjust my work in order to ease these difficulities for others?
最佳答案
How is cmake meant to be used?
$ cmake /path/to/src #replaces /path/to/src/configure
$ make
$ make install
make check
与
make test
),并且 cmake 不提供所有相同的标准目标(例如,
make distclean
),但我上面的用法是大多数开发人员会做的(因为 cmake重新运行,大多数情况下它实际上只是第二步)。
CMakeLists.txt
不支持这个工作流程,你应该有一个很好的理由。大多数工具都会采用这样的工作流程,因此您严重限制了自己。
What is a standard, what is a courtesy, and what is none of those?
How can I tell that something is a feature, an archaic backwards compatibility, or both?
target_*
函数而不是全局函数(例如,
target_include_directories
与
include_directories
)。
target_*
函数还用于传播标志,包括目录、编译器功能和我上面提到的依赖库。
Am I doing something wrong, or is it really what working with cmake should look like?
Do I really have to "reverse-engineer" other people's CMakeLists in order to use a library?
Under these circumstances, how can I convince my coworkers to use similar work process?
关于c++ - cmake的困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61504626/
我正在使用 OneWayToSource绑定(bind),它似乎总是将我的源属性设置为空。为什么呢?这给我带来了麻烦,因为我需要源属性中目标属性的值而不是空值。 这是我的代码: MyViewModel
我有一个实例变量属性,它被声明和实例化,如下所示: $self->{properties}{$key1} = $value; 我的理解是这将声明属性字段,并将其设置为包含一个键值对的哈希原语。 我正
我正在尝试检查给定的数字是否是质数。首先采用试分割法。但该程序的行为很奇怪。这是我使用的。 int no; no = Integer.parseInt(jTextField1.getText());
我正在使用 NSUserDefaults使一个对象在多个 UIViewController 之间保持同步UITabbarController 中使用的 s .为此,我正在实现以下 - (void)vi
考虑以下 Java 方法: public Boolean compare(String val1, String val2) { return val1.length() > 0 && val
我有一个问题...假设我有一个包含城市名称的表。像这样: id name 1 Los Angeles 2 Madrid 我有一张用户表: uid username locationid
我无法理解这个问题。该代码非常基本,但它的行为却出乎意料。该代码是例程的简化版本,用于从每日数据库中提取每月第 15 天的数据并将其保存到单独的文件中。哪里有问题 ?第一个 cout 打印输入外部 i
我在 中使用大背景标签,我想制作一个宽度为 960px 的容器 div。我希望容器 div 位于从顶部向下 15px 的位置,我想我必须使用 position:absolute。我的困境是;容器内的
我遇到了一个难题。我有一个 hashedX 字段,它是一个散列值/加盐值,按照惯例,加盐值保存在 mysql 数据库的同一行中。 hashedX saltX ------ ---
类 java.io.Reader 和 java.io.InputStreamReader 都有具有完全相同签名的读取方法 public int read(char[] charbuf, int off
我有一个包含多个 C# 项目的 C# 解决方案。我打算在其中添加日志记录。此日志记录应该在所有项目中可用,并且最好使用带有滚动文件日志的 log4Net。 在上述前提下,我可以想到两种方法。 在解决方
我开始学习Python,目前我非常喜欢它。但是,如果你能帮我回答几个问题,这些问题一直困扰着我,我找不到任何明确的答案: 就语言兼容性而言,Python 的 C 实现(来自 python.org 的主
我正在尝试使用 AVAssetWriter 将 CGImages 写入文件以从图像创建视频。 我已经让它在模拟器上以三种不同的方式成功运行,但在运行 iOS 4.3 的 iPhone 4 上,每种方法
我需要对一个想法进行建模,可以将其分解并考虑如下: 图书详细信息 图书价格 这里的问题是您可以为书籍设置许多价格,并且这些价格可能会发生变化。这是一个例子 图书详细信息: --------------
我有一个表,其中的行包含名为 MySubId 的列。此列中的值可以重复。我想找到 MySubId 值和出现次数最多的 MySubId 值的行数。 我有以下查询: SELECT MySubId, COU
我有两个具有多对多关系的类,因此我在它们之间创建了一个联接表(一个非常经典的示例!) 在java+hibernate中我想知道哪种方式更好?使用hibernate多对多注释在这两个类之间有多对多关系吗
我正在尝试创建一个 Android 应用程序来完成以下任务:它通过短信向一组收件人(存储在数组中的数字)发送初始调查问题。然后,对于收到的每个响应,它都会向该参与者发送该系列中的下一个问题。这是我做过
这里有一个关于 IncludeEventHandler 的有趣问题。 我正在开发一个基于 Spring 的应用程序,该应用程序使用具有单独投资组合站点的不同供应商的速度。我让供应商通过向他们提供存储在
我真的无法理解事件和委托(delegate)的概念。我知道委托(delegate)是持有方法引用的对象,可以调用具有相同返回类型和参数的方法,但事件到底是什么? 如果我需要使用事件来制作一个简单的计算
在我正在处理的一个项目中,我有一个扩展 JFrame 的主类(名为 TrackWin)。在此框架中,我使用 JTabbedPane。 用户可以从菜单栏在 Pane 中创建新选项卡。每当发生这种情况时,
我是一名优秀的程序员,十分优秀!