相关疑难解决方法(0)

在本机Windows应用程序中的资源中嵌入文本文件

我有一个C++ Windows程序.我有一个包含一些数据的文本文件.目前,文本文件是一个单独的文件,它在运行时加载并进行解析.如何将它作为资源嵌入到二进制文件中?

c c++ resources winapi text-files

45
推荐指数
1
解决办法
3万
查看次数

C/C++,您可以将文件#include到字符串文字中吗?

我有一个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,这是我首先要避免的;)

c c++ include string-literals c-preprocessor

41
推荐指数
2
解决办法
2万
查看次数

使用GNU ld链接描述文件包含二进制文件

我有一个工作的链接器脚本.我想添加另一个数据部分,其内容直接从文件中提取(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)

binary gnu ld

24
推荐指数
4
解决办法
2万
查看次数

在编译时将文件读入字符串

我想在文件中写一些东西(让我们调用它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_endNAME_len …

c c++ include c-preprocessor

19
推荐指数
2
解决办法
1万
查看次数

在c中将文本文件读入数组

将文本文件读入动态一维数组的最有效方法是什么?在每次读取char之后重新分配似乎很愚蠢,在每个读取行之后重新分配似乎不太好.我想将整个文件读入数组.你会怎么做?

c arrays

18
推荐指数
2
解决办法
5万
查看次数

使用GCC ARM工具链链接任意数据

我想链接原始二进制数据.我想把它放在一个特定的地址,或者把它链接到我在代码中定义的符号(例如char*mydata).因为它不是一个obj文件,所以我不能简单地将它链接起来.

类似的帖子(包含GNU ld链接器脚本的二进制文件)建议使用带-B bfdarch选项的objcopy .objcopy以"archictecture bfdarch unknown"作为回应.

另一个答案建议将对象转换为自定义LD脚本,然后将其包含在主LD脚本中.在这一点上,我可能只是使用一个C包含文件(这就是我现在正在做的)所以我宁愿不这样做.

我可以使用objcopy来实现这一目标,还是有其他方法?

gcc arm cortex-m3 ld

9
推荐指数
2
解决办法
4703
查看次数

是constexpr函数,可以在C++中加载文件吗?

这里有一个类似的问题,但它没有有价值的信息,所以我想再问一遍 - 是否可以使用constexpr函数加载任意文件的内容?我知道这似乎是不可能的,因为在这种情况下无法调用允许文件I/O(fopen,open...)的所有可能的函数constexpr.但是 - 由于这里有许多人关注c ++ 17的开发并且正在进行 - 是否有希望进一步的标准将包含一些文件I/O API,它们将constexpr在编译时用于加载文件?

仅仅为了比较--Haxe允许通过编译时宏执行几乎任何操作,因此在C++中使用类似的东西会非常酷.例如,通过反序列化文件生成类实例.

c++ constexpr

8
推荐指数
1
解决办法
1863
查看次数

硬编码大数据集到可执行文件?

我想将大量数据(不同长度的整数数组,文本字符串库等)直接硬编码到可执行文件中,因此没有其他文件.

我的问题是,在C++中这样做最实用,最有条理的方法是什么?根据标题或源文件,我将在何处放置数据?我应该使用什么结构?

我意识到这不是处理数据的可接受方式.但幽默我!

c++

5
推荐指数
1
解决办法
1218
查看次数

在编译时将文本文件导入原始字符串文字

我有一个文本文件,其中包含我的应用程序所需的资源。该文件包含任意纯文本,而不是带有变量赋值的 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按预期进行?是否有其他语法可以在编译时将文本文件(而不是代码)导入到变量中?

c++ resources c-preprocessor

5
推荐指数
1
解决办法
1734
查看次数

包含文件作为字符串

有没有预处理器技巧可以让我将文件作为字符串“包含”在标题中?

像这样:

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脚本。

c c++ c-preprocessor

5
推荐指数
1
解决办法
3644
查看次数