此外,我想以某种方式自动使用Linux嵌入式资源。 通常,任务是这样的:
- C ++中有一个Eclipse项目程序。
- 操作系统:Linux Ubuntu。 编译器:G ++
- 该项目使用来自外部文件的数据:本地化字符串,SQL查询,图片,声音等。
- 所有资源都必须嵌入在可执行文件中,因为计划将程序分发为可移植程序。
- 另外,由于懒惰,我希望该过程尽可能自动化。
首先,在论坛上进行搜索提供了几种解决问题的可能方法。 在那些被发现是最通用的参数中,在我看来,这个主意是使用链接器“ 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事件中,则可以解决此问题:
如何将位于项目根目录中的脚本“ 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”子目录中的所有文件本身都将属于资源。