![](/img/trans.png)
[英]Embed resources (eg, shader code; images) into executable/library with CMake
[英]CMake: Embed ELF into executable
我有一个项目需要访问嵌入到可执行文件中的ELF文件的特殊部分 。
我以前手工制作Makefiles,只是有一个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
现在我想摆脱自定义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})
我试图添加它:
target_link_libraries(binary ${PROJECT_BINARY_DIR}/${PACKAGED_FILE})
但是,由于文件尚未存在,因此失败。 它会,但CMake不知道。 将目标名称添加为链接库也无济于事,因为无法找到它。 将它添加为依赖也无济于事。 有谁知道如何实现这一目标?
我们在项目中做了类似的事情 - 我们的CMakeLists.txt
的以下部分可以解决这个问题:
set(PROJECT_EMBED_OBJ_FILES "")
set(PROJECT_EMBED_FILES "file1.elf" "file2.elf")
foreach(FILENAME ${PROJECT_EMBED_FILES})
get_filename_component(FILENAME_ONLY ${FILENAME} NAME)
get_filename_component(FILEPATH_ONLY ${FILENAME} PATH)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_ONLY}.o
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/${FILEPATH_ONLY}
COMMAND ${CMAKE_OBJCOPY}
ARGS -I binary -O elf64-x86-64 -B i386 ${FILENAME_ONLY} ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_ONLY}.o )
list(APPEND PROJECT_EMBED_OBJ_FILES ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME_ONLY}.o)
message(STATUS "Objcopy'ing ${FILENAME}")
endforeach(FILENAME)
然后在调用add_executable
:
add_executable(projectname ${PROJECT_SOURCES} ${PROJECT_EMBED_OBJ_FILES})
你可以试试
add_custom_command(TARGET $(PROJECT_NAME).elf
POST_BUILD
COMMAND ${CMAKE_OBJCOPY} ARGS -O binary ${PROJECT_NAME}.elf \
${PROJECT_NAME}.bin)
把它放在你的add_executable()
。 POST_BUILD
表示构建后执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.