我正在寻找一种方法来轻松地将任何外部二进制数据嵌入到由GCC编译的C/C++应用程序中.
我想做的一个很好的例子就是处理着色器代码 - 我可以把它保存在源文件中,const char* shader = "source here";但这是非常不切实际的.
我希望编译器为我做:在编译(链接阶段)时,读取文件"foo.bar"并将其内容链接到我的程序,以便我能够从内容中访问内容作为二进制数据码.
对于我想作为单个.exe文件分发的小型应用程序可能很有用.
GCC是否支持这样的事情?
我试图将二进制blob嵌入到exe文件中.我正在使用mingw gcc.
我像这样制作目标文件:
ld -r -b binary -o binary.o input.txt
Run Code Online (Sandbox Code Playgroud)
然后我看objdump输出来获取符号:
objdump -x binary.o
Run Code Online (Sandbox Code Playgroud)
它给出了符号:
_binary_input_txt_start
_binary_input_txt_end
_binary_input_txt_size
Run Code Online (Sandbox Code Playgroud)
然后我尝试在我的C程序中访问它们:
#include <stdlib.h>
#include <stdio.h>
extern char _binary_input_txt_start[];
int main (int argc, char *argv[])
{
char *p;
p = _binary_input_txt_start;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我这样编译:
gcc -o test.exe test.c binary.o
Run Code Online (Sandbox Code Playgroud)
但我总是得到:
undefined reference to _binary_input_txt_start
Run Code Online (Sandbox Code Playgroud)
有谁知道我做错了什么?
我有很多大于65535字节的字符串文字.我不允许将这些字符串保存为单独的文件,我如何解决字符串限制?
MSVC:2048
GCC:无限制(最多100,000个字符),但在510个字符后发出警告:
Run Code Online (Sandbox Code Playgroud)String literal of length 100000 exceeds maximum length 509 that C90 compilers are required to support