相关疑难解决方法(0)

使用GCC在可执行文件中嵌入资源

我正在寻找一种方法来轻松地将任何外部二进制数据嵌入到由GCC编译的C/C++应用程序中.

我想做的一个很好的例子就是处理着色器代码 - 我可以把它保存在源文件中,const char* shader = "source here";但这是非常不切实际的.

我希望编译器为我做:在编译(链接阶段)时,读取文件"foo.bar"并将其内容链接到我的程序,以便我能够从内容中访问内容作为二进制数据码.

对于我想作为单个.exe文件分发的小型应用程序可能很有用.

GCC是否支持这样的事情?

c c++ resources gcc embedded-resource

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

为什么C编译器将下划线添加到外部名称?

我已经在C工作了很长时间以至于编译器通常在一个开头添加一个下划线这一事实extern只是被理解......然而,今天另一个SO问题让我想知道为什么添加下划线的真正原因.一篇维基百科文章称,原因是:

C编译器的常见做法是在所有外部作用域程序标识符之前加上前导下划线,以避免与运行时语言支持的贡献发生冲突

我认为这至少有一个真实的核心,但它似乎并没有真正回答这个问题,因为如果将下划线添加到所有外部,它对防止冲突没有多大帮助.

有没有人有关于领先下划线的理由的良好信息?

增加的下划线部分原因是Unix creat()系统调用不以'e'结尾?我听说某些平台上的早期链接器名称限制为6个字符.如果是这种情况,那么将下划线添加到外部名称似乎是一个彻头彻尾的疯狂想法(现在我只有5个字符可以玩......).

c language-history

34
推荐指数
2
解决办法
9425
查看次数

使用CMake将资源(例如,着色器代码;图像)嵌入到可执行文件/库中

我正在用C++编写一个应用程序,它依赖于我项目中的各种资源.现在,我有从生成的可执行文件到我的源中硬编码的每个资源的相对路径,这允许我的程序打开文件并读入每个资源中的数据.这工作正常,但它要求我从相对于资源的特定路径启动可执行文件.因此,如果我尝试从其他任何地方启动我的可执行文件,它将无法打开文件而无法继续.

有没有一种可移植的方法让CMake将我的资源嵌入到可执行文件(或库)中,以便我可以在运行时只在内存中访问它们而不是打开路径脆弱的文件?我找到了一个相关的问题,看起来嵌入资源可以用一些ld魔法做得很好.所以我的问题是如何使用CMake 以便携,跨平台的方式做到这一点?我实际上需要在x86和ARM上运行我的应用程序.我只支持Linux(嵌入式),但如果有人可以建议如何为Windows(嵌入式)做这个,也可以获得奖励积分.

编辑:我忘了提到解决方案的理想属性.我希望能够在为ARM构建时使用CMake交叉编译应用程序,而不是必须在我的ARM目标上本地编译它.

c++ cmake cross-compiling embedded-resource

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

是否有任何标准方法将资源嵌入Linux可执行映像?

通过Windows API将二进制资源嵌入到PE映像(EXE,DLL)中非常容易(参见http://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx).

Linux中是否有类似的标准API?

或者某种事实上的资源嵌入方法?

目标是将一些静态二进制和/或文本数据嵌入到可执行文件中,例如图片,HTML等.这样程序二进制分发就像制作一个文件一样简单?(假设所有库依赖项都可以)

更新:

根据bdk的建议,我尝试了使用gcc mingw嵌入二进制blob中描述的解决方案,它对有用.虽然,有一些值得一提的问题:我的项目(在Code :: Blocks中)由许多C++文件组成,并将二进制数据添加到任何相应的目标文件中,使得它们无法破坏构建 - objdump -x将显示大多数嵌入后符号已经消失(我没有找到如何解决它).为了解决这个问题,我在项目中添加了一个空的虚拟.cpp文件,其唯一目的是提供一个可以使用的目标文件,并为该文件编写了以下自定义构建步骤,该文件很好地完成了工作(示例使用Code :: Blocks宏) ):

$compiler $options $includes -c $file -o $object
ld -Ur -b binary -o $object <binary payload path>
Run Code Online (Sandbox Code Playgroud)

c++ linux embedded-resource

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

如何将文件嵌入可执行文件?

我有两个问题,第一个问题已经解决了.

当前问题
如果我嵌入了一个需要加载库的文件,例如jpeg图像或mp3音乐,我将需要使用该文件作为库的输入.但是,每个库都是不同的,并使用一种方法来获取文件作为输入,输入可以是文件名或FILE*指针(来自libc的文件界面).

我想知道如何访问带有名称的嵌入式文件.如果我创建一个临时文件,那将是低效的,还有另外一种方法吗?我可以将文件名映射到内存吗?我的平台是Windows和Linux.

如果show_file(const char*name)是库中的函数,我将需要一个字符串来打开该文件.
我已经看到了这些问题:
如何在内存中获取缓冲区的文件描述符?
从C中的文件描述符获取文件名

以下代码是我的解决方案.这是一个好的解决方案吗?它效率低下吗?

# include <stdio.h>
# include <unistd.h>

extern char _binary_data_txt_start;
extern const void* _binary_data_txt_size;
const size_t len = (size_t)&_binary_data_txt_size;

void show_file(const char* name){
    FILE* file = fopen(name, "r");
    if (file == NULL){
        printf("Error (show_file): %s\n", name);
        return;
    }

    while (true){
        char ch = fgetc(file);
        if (feof(file) )
            break;
        putchar( ch );
    }
    printf("\n");

    fclose(file);
}

int main(){

    int fpipe[2];
    pipe(fpipe);

    if( !fork() ){
        for( int buffsize = len, done …
Run Code Online (Sandbox Code Playgroud)

c c++ binary executable file

16
推荐指数
2
解决办法
6813
查看次数

CMake:将ELF嵌入可执行文件

我有一个项目需要访问嵌入到可执行文件中特殊部分的ELF文件。

我以前是手工制作Makefile的,只是有一个shell脚本,在其中使用objcopy将要嵌入的目标复制到.o文件中,然后在可执行文件中链接到该文件。

# Create a new section and copy the binary there ($1=input $2=output name)
objcopy --input-target binary --output-target elf64-x86-64 \
        --binary-architecture i386 $1 $2.o
Run Code Online (Sandbox Code Playgroud)

现在,我想摆脱自定义的Makefile,并使用CMake生成它们。但是,我看不到链接到此类文件的简便方法。我可以创建和添加此文件,但不能对其进行链接:

# Invoke script to package module as a library
add_custom_command(OUTPUT ${PACKAGED_FILE}
  COMMAND ./package.sh ${MODULE_FILE} ${PACKAGED_FILE}
  WORKING_DIRECTORY ${MODULE_DIR}
  DEPENDS ${MODULE_FILE}
  COMMENT packaging file into ELF object
  VERBATIM
)

add_custom_target(${PACKAGED_NAME} ALL DEPENDS ${PACKAGED_FILE})
Run Code Online (Sandbox Code Playgroud)

我试图用添加它:

target_link_libraries(binary ${PROJECT_BINARY_DIR}/${PACKAGED_FILE})
Run Code Online (Sandbox Code Playgroud)

但是,此操作失败,因为该文件尚不存在。会的,但是CMake不知道。将目标名称添加为链接库也无济于事,因为找不到它。将其添加为还依赖项也无济于事。有谁知道如何做到这一点?

c c++ makefile cmake elf

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