C / C ++。 在Linux上的GCC中工作时如何使用嵌入式应用程序资源

此外,我想以某种方式自动使用Linux嵌入式资源。 通常,任务是这样的:


  1. C ++中有一个Eclipse项目程序。
  2. 操作系统:Linux Ubuntu。 编译器:G ++
  3. 该项目使用来自外部文件的数据:本地化字符串,SQL查询,图片,声音等。
  4. 所有资源都必须嵌入在可执行文件中,因为计划将程序分发为可移植程序。
  5. 另外,由于懒惰,我希望该过程尽可能自动化。

首先,在论坛上进行搜索提供了几种解决问题的可能方法。 在那些被发现是最通用的参数中,在我看来,这个主意是使用链接器“ ld ”的“ --format=binary ”参数。 论坛中的帖子向以下团队承诺:

 g++ -Wl,--format=binary -Wl,my.res -Wl,--format=default 

将“ my.res”文件链接到应用程序,并创建两个字符_binary_my_res_start_binary_my_res_end ,分别指示链接文件中相同数据的开始和结束。 因此,可以通过以下方式从C ++访问数据:
 extern const uint8_t my_res_start[] asm("_binary_my_res_start"); extern const uint8_t my_res_end[] asm("_binary_my_res_end"); 

但事实确实如此。 我们按需编写所有内容,而编译器并不满意。 找不到符号«_binary_my_res_start» 。 恩,没什么, nm可以帮助我们。 我们编写以下命令:

 nm MyProgramm |grep -w -o -P -e '_binary_[\w\d_]+' 

我们得到:

 _binary__home_unknown_workspace_MyProgramm_res_my_res_sql_end _binary__home_unknown_workspace_MyProgramm_res_my_res_sql_start 

事实证明,符号的名称包括指向符号的完整路径,将来可能会导致需要不断重写包含资源链接的头文件。 如果将以下脚本添加到Eclipse项目设置中的PostBuild事件中,则可以解决此问题:

 #!/bin/bash OUTPUT=$1/resources.h printf '#ifndef __RESOURCES_H__\n' > "$OUTPUT" printf '#define __RESOURCES_H__\n\n' >> "$OUTPUT" printf '#include <inttypes.h>\n\n' >> "$OUTPUT" SYMBOLS=$(nm NewsParser |grep -w -o -P -e '_binary_[\w\d_]+') >> "$OUTPUT" VAR_SIZES_LIST='' for SYMBOL in $SYMBOLS do VAR_NAME=$(echo $SYMBOL | grep -o -P -e 'res_[\w\d_]+'|cut -c 5-) if [[ -z $(echo $SYMBOL|grep _size) ]] then printf '\textern const uint8_t '$VAR_NAME'[]\tasm("'$SYMBOL'");\n\n' >> "$OUTPUT" else START_VAR=$(echo $VAR_NAME|rev|cut -c 5-|rev)'start' END_VAR=$(echo $VAR_NAME|rev|cut -c 5-|rev)'end' VAR_SIZES_LIST=$VAR_SIZES_LIST$(printf '\\tconst uint64_t '$VAR_NAME'\\t=\\t'$END_VAR' - '$START_VAR';\\n\\n') fi done printf "$VAR_SIZES_LIST" >> "$OUTPUT" printf '#endif\n' >> "$OUTPUT" printf 'File '$OUTPUT' is generated.\n' 

如何将位于项目根目录中的脚本“ update_resource.sh”添加到Eclipse项目设置中的PostBuild事件中。


好啊 现在,头文件每次都将像新文件一样,并且您可以通过变量名称来访问数据,除非您重命名资源文件本身,否则变量名称不会更改。 此外,此脚本还计算每个资源的大小。 将指针从起点到终点不仅是一个大问题,而且仍然更加方便。

但是,到目前为止,这还不是全部。 毕竟,将每个新资源添加到项目中都会变成有形的广告。 而且仅在链接阶段,也可以借助脚本来解决此问题:

 FLAGS=$1 OUTPUT_FLAG=$2 OUTPUT_PREFIX=$3 OUTPUT=$4 INPUTS=$5 RESOURCE_PATH=$6 RESOURCES='' for res_file in $(ls $RESOURCE_PATH/*) do RESOURCES=$RESOURCES' '-Wl,$res_file echo ' '$res_file'   ' done g++ $FLAGS $OUTPUT_FLAG $OUTPUT_PREFIX$OUTPUT $INPUTS -Wl,--format=binary $RESOURCES -Wl,--format=default 

如何在Eclipse项目设置中用自定义脚本替换标准链接程序的调用。


  • 图片中用红色标记地方,脚本“ link.sh”的路径位于项目的根目录,而不是标准的调用链接程序的命令。
  • 图片中的绿色是在另一个链接器添加到通常的链接器参数的地方,该位置告诉脚本资源所在的目录位置。
  • 此外 ,重要的是不要忘记用双引号将其余参数包装起来,以免它们在脚本等待它们的顺序错误的情况下被空格意外破坏。


太好了 现在,在每个程序集中,“ res”子目录中的所有文件本身都将属于资源。

Source: https://habr.com/ru/post/zh-CN468399/


All Articles