【发布时间】:2020-10-27 04:58:15
【问题描述】:
我正在编写一个基于 OpenVPN3 的库,它是 C++ OpenVPN 客户端实现仅在标头中,没有 cpp 文件。因此,我不得不依赖只有一个 cpp 文件,即客户端本身,其中包含一个包含大量其他标头的标头。
问题是,正因为如此,我无法将代码分成多个 cpp 文件。我希望人们能够使用我的库,无论是由他们预编译还是编译,但它们不能在超过 1 个 cpp 文件中包含相同的头文件,或者在链接过程中会有很多重新定义。例如,标题中还有一些静态变量。
如果有人想看看添加到“主”头文件中的东西的数量:https://github.com/lucaszanella/libopenvpn3/blob/9b3440a736d90b671e9376d2d9e4911475e07112/src/OpenVPNClient.hpp
我知道有一些像 Asio 这样的库也是只有标头的,每个人都可以毫无问题地使用它们。
一些不重新定义类或函数的技术是转发声明它们但不给出定义,但这里的问题是使用我的库的人将不得不访问它的方法和所有内容。是否可以将我的方法与我的库在标题上使用的方法分开?
【问题讨论】:
-
您应该能够使用通常的
#ifndeffencing 防止重复导入。 -
但这里的问题是使用我的库的人将不得不访问它的方法和所有内容。是否可以将我的方法与我的库在标题上使用的方法分开?你可能不想要标题。
-
将标头中的变量标记为
inline -
@tadman 我正在处理大约 2 个包含相同标题的 cpp 文件。发生这种情况时,它们都定义了相同的静态变量等,这会导致问题
-
发布一个最小的可重现示例(您的代码包含 openvpn 标头并导致问题)会改善问题