【发布时间】: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++。甚至有适合C和C++的方法。所以去掉C标签在某种程度上是有意义的。 -
@Tsyvarev:;绝对不是。 C 中没有自定义名称空间,不是 C 支持的名称修饰等必需的符号功能。仅使用 C ABI 函数并不能证明添加 C 标记是合理的。请随时提供我错了的证据,在问题中提供所需信息并发布minimal reproducible example。