问题标签 [header-only]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
59 浏览

c++ - 如何强制我的 INTERFACE 库上的依赖项使用 C++11 或更高版本?

我正在将我的库拆分为仅标头库和已编译库,因此,我第一次尝试使用 CMake 来“构建”,或者更确切地说,公开仅标头库图书馆。

阅读文档和 CMake 文档,我知道我需要使用没有源的 INTERFACE 库。但是 - 我的头文件必须使用至少 C++11 的 C++ 语言标准版本进行编译。当我实际编译一些东西时,我做了:

但那是:

  1. 不完全是我需要使用仅标头库的代码 - 我需要说“至少 C++11”。
  2. 不能用于 INTERFACE 库。

我注意到没有set_property(... INTERFACE). 那么我应该如何强制依赖代码使用 C++11 或更高版本?

编辑:我对在依赖项中限制确切的C++ 版本选择的答案和限制“至少”的答案都感兴趣——以防后者有问题/困难/不可能。

0 投票
1 回答
67 浏览

c++ - c++11中的constexpr模板元信息变量

我试图以结构化的方式(即使用类)表示一些元信息。它只是标题,我需要支持 c++11,所以不能使用内联变量。我提出了几个潜在的解决方案,但每个都有其缺点。任何建议都将不胜感激,尽管只是指出如何使“替代 B”编译对我来说是一个很好的解决方案。

SthInfo::fieldA用作模板的参数,Processor<Type>::work(field)其中:

  • 检查“容器类型”是否与该处理器匹配
  • 并将 ID 与其他不相关的参数一起使用做一些内部逻辑

备选方案 A - 有效但模板化的 ID

这在 Linux 和 Windows 上可以正常工作(编译和链接)。但是,有没有办法避免ID模板中的常量并将其作为FieldInfo类中的字段?还有其他改进的想法吗?

备选方案 B - 损坏 - 不会链接

我尝试更改为以下代码,但它没有在 Linux 上链接(但在 Windows 上...)undefined reference to SthInfo::fieldA

替代 C - constexpr 函数 - 不太好用。

更改SthInfo::fieldA为 constexpr 函数会有所帮助,但是()在应用程序代码中使用时必须使用...

0 投票
0 回答
54 浏览

c++ - 我可以隐藏第三方头文件中的定义吗?

我正在编写一个仅使用头文件的库,仅使用 .hpp 和 .ipp 文件。有时我必须#include 一些标准库。

但是 IDE 解析所有内容并向用户显示建议会变得很昂贵。我不想拆分我的定义和实现,因为我正在尝试编写一个仅包含标头的库。

我无法找到一个明智的解决方案来克服这个问题。对于这种情况,有没有实用的方法可以遵循?

提前致谢。

0 投票
1 回答
2812 浏览

c++ - 使用 cmake 将 Eigen 库添加到 c++ 项目

不幸的是,我在 Ubuntu 18.04.4 LTS 系统上使用 Cmake将只有Eigen 3.3.7 库的标头添加到我的 Makefile 时遇到了一些问题。我可以使用库编译我的代码,只需复制包含目录中的库文件夹并 include_directories(./include/eigen3)在 CMakeLists.txt 文件中使用。但是,我更希望不对库路径进行硬编码,而是能够在 CMakeLists.txt 文件中动态设置它,以便更轻松地与其他人共享项目。不幸的是,我找到的所有说明都没有对我有用。

我准备了以下最小代码示例:

主.cpp:

CMakeLists.txt:

我只下载了标题Eigen 3.3.7 Library并将文件夹重命名为 eigen3。然后将该文件夹移动到: /usr/local/share/eigen3

当我运行时,cmake CMakeLists.txt我收到以下错误:

当我检查 Eigen 库文件夹时,我意识到/usr/local/share/eigen3/cmake它只包含一个名为 Eigen3Config.cmake.in 的文件,而不是必需的 Eigen3Config.cmake。为什么会这样?

我尝试将文件重命名为 Eigen3Config.cmake。这里的错误如下:

此外,我还尝试了解释stackoverflow 的解决方案:CMake find_package not working for Eigen? 没有成功。

我怎样才能使它正常工作?另外我认为我还不太了解底层系统。任何解释将不胜感激。

0 投票
0 回答
68 浏览

c++ - 创建可以通过 add_subdirectory 包含的仅标头库

我正在为 C++20 中的协程创建一个轻量级的仅包含标头的库,称为 Conduit。库的结构是这样的,除了 C++ 标准库之外没有其他依赖:

问题:如何为我的库编写 CMakeLists.txt 文件,以便其他项目可以通过将其添加为子目录来使用 Conduit add_subdirectory

虽然导管确实提供了安装选项,但人们使用导管的预期方式是将其作为子目录添加到他们的项目中。在 example_project 的 CMakeLists.txt 文件夹内,会有一行add_subdirectory(conduit),目录结构example_project如下所示:

到目前为止我所拥有的:这是我目前用作管道的 CMakeLists.txt 文件的内容。它使用各种不同的测试编译和运行 tests.cpp,但是当我将管道作为子目录添加到另一个项目时(通过add_subdirectoryCMakeLists.txt 中的 git submodule +),CMake 不会将管道/包含/添加到列表中的包含文件。

0 投票
0 回答
73 浏览

c++ - 将库链接到仅标题的库

我有两个库:

  • a;
  • b: 一个仅头文件的库,它依赖于a.

我不确定是否可以链接ba. 如果是这样,我该怎么做?

事实上,我有一个c依赖于两者的第三个库。此 CMake 脚本不起作用:

我通过将源文件添加ac.

0 投票
1 回答
131 浏览

c++11 - 多重定义错误(collect2:error:ld returned 1 exit status)

我使用https://github.com/jdduke/three_cpp作为仅标头模式,但在使用我的项目编译时遇到了一些问题。

当我在多个 C++ 文件中包含以下matrix4.hpp 标头(仅包含必要部分)时,会出现此问题

三/core/matrix4.hpp(删除不需要的部分)

三/core/impl/matrix4.ipp(删除不需要的部分)

当从多个 C++ 文件中包含三个/core/matrix4.hpp 时,生成多个定义错误

因此,根据我们的试验,我们注意到THREE_DECLmatrix4.hpp 中的以下函数未提及

  • Vector3 getColumnX() const;
  • Vector3 getColumnY() const;
  • Vector3 getColumnZ() const;
  • Matrix4& setPosition( const Vector3& v );

因此,在修改这些功能后,如下错误已修复

  • THREE_DECL Vector3 getColumnX() const;
  • THREE_DECL Vector3 getColumnY() const;
  • THREE_DECL Vector3 getColumnZ() const;
  • THREE_DECL Matrix4& setPosition( const Vector3& v );

基于三个/config.hpp在使用仅标头版本的情况下THREE_DECL定义为inline.

我不明白的是

  1. 为什么即使在不同的编译单元中包含相同的头文件,也会出现多个定义错误?
  2. 添加THREE_DECL对于解决这些问题的意义是什么?

任何帮助将不胜感激。

0 投票
0 回答
195 浏览

c++ - 如何为 CMake 指定仅限标头的 boost 库?

我正在使用以下 cmake 文件

在 CMake 配置阶段它写

这证明它boost/opt/boost.

不幸的是,在编译期间它说它找不到包含文件

虽然,文件在那里

boost那么,如何CMake正确配置呢?

0 投票
0 回答
101 浏览

c++ - CMAKE 对上游 C++ Header-only 库的依赖

我有一个相对简单的仅包含标头的 C++ 库,其结构如下

该库本身位于项目的根目录中,然后app1添加。我的意图是使用仅标头库作为引用包含目录链接依赖项的目标。

这是根CMakeLists.txt文件:

CMakeLists.txt应用程序的文件:

由于app1是下游,myLib我认为我可以添加myLib到应用程序的链接库中,它会自动配置所有内容。这不起作用,并且app不到.myLib

任何想法如何解决这个问题,或者如果方法一开始就错误的解释?

谢谢

0 投票
0 回答
191 浏览

c++ - 如何为 CMake 中的仅标头库为内部和外部#includes 创建不同的 target_include_directories?

我的仅标头库的目录结构如下:

基本上我希望能够在 file1.h 中执行以下操作(因此在项目中的任何位置):

但必须在任何外部项目中执行以下操作:

目前,我的天真实现是在 CMakeLists.txt 中:

允许内部和外部文件都可以做到。然而,这还不够严格,我正在寻找的是与此等效的东西:

但这显然会导致 CMake 错误,因为:

有可能做我想做的事吗?预先感谢您的帮助。