CMake链接依赖Python脚本构建的xed库的core库时出现undefined reference报错
问题解决方案
你的配置存在3个核心问题导致链接错误:
- add_custom_command生成的libxed.a没有被core库正确依赖,构建core时可能xed还未编译完成,或找到的是旧版本库文件
- 相对路径使用混乱,自定义命令的输出路径、xed安装路径和add_library中引用的路径没有对齐
- 直接把静态库放入add_library的源文件列表,无法保证链接顺序和依赖传递
修正后的完整CMakeLists.txt配置如下:
project(libcore VERSION 0.1) find_package(Python3 COMPONENTS Interpreter REQUIRED) # 定义xed相关绝对路径,避免相对路径混乱 set(XED_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third-party/xed/xed) set(XED_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/third-party/xed/build) set(XED_INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}/third-party/xed/install) set(XED_LIB_PATH ${XED_INSTALL_DIR}/lib/libxed.a) set(XED_INCLUDE_DIR ${XED_INSTALL_DIR}/include) # 自定义命令构建xed add_custom_command(OUTPUT ${XED_LIB_PATH} COMMAND ${CMAKE_COMMAND} -E make_directory ${XED_BUILD_DIR} COMMAND Python3::Interpreter ${XED_SOURCE_DIR}/mfile.py --jobs=4 --build-dir=${XED_BUILD_DIR}/obj --src-dir=${XED_SOURCE_DIR} --static --opt=3 --prefix=${XED_INSTALL_DIR} --install-dir=${XED_INSTALL_DIR} --no-amd --no-via --no-encoder --compress-operands install MAIN_DEPENDENCY ${XED_SOURCE_DIR}/mfile.py COMMENT "Building Intel XED library" ) # 自定义目标关联xed构建输出,确保依赖可以被正常触发 add_custom_target(xed_build DEPENDS ${XED_LIB_PATH}) # 定义core静态库,不要直接把libxed.a放入源文件列表 add_library(core STATIC src/arch.cpp src/cpu.cpp src/floppy.cpp src/pic.cpp src/pit.cpp src/ports.cpp src/ppi.cpp src/ram.cpp ) # 让core依赖xed_build,保证编译core之前xed已经构建完成 add_dependencies(core xed_build) # 链接xed静态库到core,并且将依赖传递给所有依赖core的目标 target_link_libraries(core PUBLIC ${XED_LIB_PATH}) # 头文件路径增加xed的安装目录 target_include_directories(core PUBLIC ${PROJECT_SOURCE_DIR}/include ${XED_INCLUDE_DIR} ) target_precompile_headers(core PUBLIC include/pch.hpp)
额外排查注意事项
- 跨平台编译场景需要确认xed编译出来的库架构和主项目一致,避免架构不兼容导致符号找不到
- 检查core库源文件引用xed头文件时是否正确添加了
extern "C"包裹,C++编译时如果没有用extern "C"引用C语言编写的xed头文件,会导致符号名不匹配出现undefined reference - 链接出错后可以执行
nm libxed.a查看对应符号是否存在,确认是库未正确编译还是链接顺序/符号名问题
内容的提问来源于stack exchange,提问作者Adrien
相关产品推荐
相关产品推荐

