我有一个C++ Windows程序.我有一个包含一些数据的文本文件.目前,文本文件是一个单独的文件,它在运行时加载并进行解析.如何将它作为资源嵌入到二进制文件中?
我有一个C++源文件和一个Python源文件.我希望C++源文件能够将Python源文件的内容用作大字符串文字.我可以这样做:
char* python_code = "
#include "script.py"
"
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为每条线的末尾都需要.我可以手动复制并粘贴Python代码的内容,并用引号和终止\n包围每一行,但这很难看.即使python源有效地编译到我的C++应用程序中,我也希望将它保存在一个单独的文件中,因为它更有条理,并且对编辑器更有效(emacs不够聪明,无法识别C字符串文字是python代码,当你在里面时切换到python模式).
请不要建议我使用PyRun_File,这是我首先要避免的;)
我有一个工作的链接器脚本.我想添加另一个数据部分,其内容直接从文件中提取(ld不应该解析它并提取部分等等).我怎样才能做到这一点?
OUTPUT_FORMAT("elf32-i386")
ENTRY(start)
SECTIONS
{
.text 0x100000 : {
*(.multiboot)
*(.text)
*(.code)
*(.rodata*)
}
.data : {
*(.data)
}
.bss : {
*(.bss)
}
kernel_end = .;
roottask_start = .;
.data : {
HERE I WANT TO INCLUDE THE ENTIRE CONTENTS OF ANOTHER (BINARY) FILE
}
roottask_end = .;
}
Run Code Online (Sandbox Code Playgroud) 我想在文件中写一些东西(让我们调用它foo.cpp)并在编译时将它作为字符串包含到我的程序中,类似于#include它的方式.
现在我正在使用这个C预处理器#define:
#define toString(src) #src
Run Code Online (Sandbox Code Playgroud)
将一堆代码转换为字符串,如下例所示:
const char* str = toString(
int x;
void main(){}
);
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以在那里阅读宏字符串化.
我想将该代码移动到外部文件,该文件将在编译时"链接". 我不希望文件必须与程序一起分发,如果我在运行时读取它就是这种情况.
我尝试使用#include如下所示的指令,但编译器拒绝了它:
const char* str = toString(
#include "foo.cpp"
);
Run Code Online (Sandbox Code Playgroud)
g++似乎完全困惑,但clang++给了我这个错误:
error: embedding a #include directive within macro arguments is not supported
Run Code Online (Sandbox Code Playgroud)
有谁知道是否/如何做到这一点?
注意:我正在使用它来编写我的GLSL着色器,尽管我怀疑这些信息是否有用.
PS:在你告诉我这是一个重复的问题之前,将我的代码放在一个巨大的字符串中,或者使用外部工具(例如xxd)来转储它的十六进制表示对我来说不是"解决方案",因为它们是不比我现在的方法更好(即更容易/更清洁).
几年后更新:
我刚刚意识到我从来没有回答过这个问题,因为它被重复关闭了.当我看到这个提交时,我找到了我正在寻找的答案,它本身基于对本文的评论,并且从那时起就一直在使用它.
简而言之,一个小的汇编文件包含您想要的文件NAME,并使用这三个变量在给定的文件下公开它们NAME_begin,NAME_end并NAME_len …
将文本文件读入动态一维数组的最有效方法是什么?在每次读取char之后重新分配似乎很愚蠢,在每个读取行之后重新分配似乎不太好.我想将整个文件读入数组.你会怎么做?
我想链接原始二进制数据.我想把它放在一个特定的地址,或者把它链接到我在代码中定义的符号(例如char*mydata).因为它不是一个obj文件,所以我不能简单地将它链接起来.
类似的帖子(包含GNU ld链接器脚本的二进制文件)建议使用带-B bfdarch选项的objcopy .objcopy以"archictecture bfdarch unknown"作为回应.
另一个答案建议将对象转换为自定义LD脚本,然后将其包含在主LD脚本中.在这一点上,我可能只是使用一个C包含文件(这就是我现在正在做的)所以我宁愿不这样做.
我可以使用objcopy来实现这一目标,还是有其他方法?
这里有一个类似的问题,但它没有有价值的信息,所以我想再问一遍 - 是否可以使用constexpr函数加载任意文件的内容?我知道这似乎是不可能的,因为在这种情况下无法调用允许文件I/O(fopen,open...)的所有可能的函数constexpr.但是 - 由于这里有许多人关注c ++ 17的开发并且正在进行 - 是否有希望进一步的标准将包含一些文件I/O API,它们将constexpr在编译时用于加载文件?
仅仅为了比较--Haxe允许通过编译时宏执行几乎任何操作,因此在C++中使用类似的东西会非常酷.例如,通过反序列化文件生成类实例.
我想将大量数据(不同长度的整数数组,文本字符串库等)直接硬编码到可执行文件中,因此没有其他文件.
我的问题是,在C++中这样做最实用,最有条理的方法是什么?根据标题或源文件,我将在何处放置数据?我应该使用什么结构?
我意识到这不是处理数据的可接受方式.但幽默我!
我有一个文本文件,其中包含我的应用程序所需的资源。该文件包含任意纯文本,而不是带有变量赋值的 C++ 代码。我不想将文本文件与我的申请一起发送;我更愿意将其编译到其中。所以我尝试了以下方法:
#include <iostream>
#include <string>
int main() {
std::string test = R"(
#include <textresource.txt>
)";
std::cerr << test << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我希望#include第 6 行在预处理时执行,并替换为资源文件的内容。之后,编译器将看到带有资源数据的原始字符串文字。
然而,输出只是#include <textresource.txt>带有换行符的文本。显然,它#include从未被执行过。(我使用的是 Visual Studio 2015。)
为什么工作没有#include按预期进行?是否有其他语法可以在编译时将文本文件(而不是代码)导入到变量中?
有没有预处理器技巧可以让我将文件作为字符串“包含”在标题中?
像这样:
a.txt
lorem ipsum dolorem
sit amet
Run Code Online (Sandbox Code Playgroud)
而“魔术”包含调用与此类似:
header.h
MAGICINCLUDE(a.txt, atxt)
Run Code Online (Sandbox Code Playgroud)
结果,预处理器会欺骗,上面的行与此等效:
const char* atxt = "lorem ipsum dolorem\n\
sit amet";
Run Code Online (Sandbox Code Playgroud)
不应使用任何外部工具,而应使用预处理器:我试图摆脱执行此操作的python脚本。