【问题标题】:Issues embedding resources from a namespace (C++ & CMake) [closed]从命名空间(C++ 和 CMake)嵌入资源的问题 [关闭]
【发布时间】:2018-09-21 08:31:48
【问题描述】:

我一直在使用一种技术,将资源(原始二进制数据)嵌入到已编译的可执行文件中,结合使用 C、C++ 和 CMake。

我使用的代码/配置与this GitHub repository 中提供的非常相似,我什至用这个特定的示例重现了这个问题。

按原样使用,资源嵌入效果很好,但是一旦引入 C++ 命名空间,事情就会左右中断。

问题似乎是 C 风格的资源在 C++ 中调用时默认使用全局/匿名命名空间,但如果它们是从 C++ 中的命名空间调用的,则该命名空间将作为资源的前缀,这会导致未定义的符号。

到目前为止,我已经尝试了所有我能想到的方法,包括将原始 C 样式代码转换为 C++ 并使用命名空间,这会产生相同的结果。

具体调用/代码的更多细节可以在this GitHub issue看到。

附言。我意识到这篇文章中几乎没有任何代码/上下文,但我认为链接到通过这个的原始主题/文章会更有意义,而不是试图自己解释它。此外,如果有帮助,这个话题也已经在 here 甚至 StackOverflow here 上讨论过。

【问题讨论】:

  • 我在教我儿子一些技巧​​的同时,用着色器做了类似的事情。看看这个项目的shaders 目录。 github.com/AlexAndDad/dungeon
  • 你希望每个人都熟悉这个工具(“embed-resource”)吗?查看its code 我看到了简单的char sym_name[] = { bytes ... }; 定义。不确定名称空间如何与之相关。以及 CMake 如何与所有这些问题相关联?是的,该工具使用 CMake,但问题与 CMake 无关,不是吗?一些代码示例肯定会改善这个问题。
  • 这显然不是 C,而是纯 C++ 问题。
  • @Olaf:据我了解,问题是关于将C 方法“移植”到C++。甚至有适合CC++ 的方法。所以去掉C标签在某种程度上是有意义的。
  • @Tsyvarev:;绝对不是。 C 中没有自定义名称空间,不是 C 支持的名称修饰等必需的符号功能。仅使用 C ABI 函数并不能证明添加 C 标记是合理的。请随时提供我错了的证据,在问题中提供所需信息并发布minimal reproducible example

标签: c++ cmake


【解决方案1】:

C++ 代码中包含的 C 头文件中的 extern "C" 正是用于从没有命名空间的 C++ 调用 C 函数/对象(或者更好的是:用于调用函数/对象,而不是使用 C++ 重整名称,而是使用 C 名称)。This embded-rsource tool 很酷,只需像这样在LOAD_RESOURCE 中添加extern "C"

 #define LOAD_RESOURCE(RESOURCE) ([]() {                      \
    extern "C" const char _resource_##RESOURCE[]; extern "C" const size_t _resource_##RESOURCE##_len;   \
    return Resource(_resource_##RESOURCE, _resource_##RESOURCE##_len);  \
})()

这样你就告诉编译器,__resource##RESOURCE 不是 C++ 符号,而是用 C 编译器编译的 C 符号。

【讨论】:

  • 请注意,在 C++ 中不必要地使用宏甚至比在 C 中更糟糕,不仅仅是符号。
  • 虽然这很有意义,但不幸的是它不起作用,大概是因为使用了宏?错误:预期的不合格 ID
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 2011-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多