我有一个项目需要访问嵌入到可执行文件中的 ELF 文件特别部分 https://stackoverflow.com/questions/2627004/embedding-binary-blobs-using-gcc-mingw.
我之前手工制作 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})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)