当链接到使用Python脚本构建的另一个库的库时,使用未定义的引用



我是cmake的新手,我正在尝试移植我以前用手写makefile构建的项目。可执行文件使用一个库";核心";我构建的需要lib&;xed";(英特尔撰文)。Xed使用python脚本来构建,因此在CMakeLists中构建我的lib核心时,我使用了一个";add_custom_command"按照英特尔提供的说明构建xed:

project(libcore VERSION 0.1)
find_package(Python3 COMPONENTS Interpreter REQUIRED)
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 third-party/lib/libxed.a)
add_custom_command(OUTPUT third-party/lib/libxed.a
COMMAND ${CMAKE_COMMAND} -E make_directory third-party/xed/build
COMMAND ${PYTHON3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/third-party/xed/xed/mfile.py --jobs=4 --build-dir=third-party/xed/build/obj --src-dir=${CMAKE_CURRENT_SOURCE_DIR}/third-party/xed/xed --static --opt=3 --prefix=third-party --install-dir=third-party/xed/kits/xed-install-date-os-cpu --no-amd --no-via --no-encoder --compress-operands install
)
target_include_directories(core PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/third-party/include PUBLIC ${PROJECT_SOURCE_DIR}/include)
target_precompile_headers(core PUBLIC include/pch.hpp)

问题是,当将我的最终产品与我的lib链接时;libcore.a";我有很多对xed函数的未定义引用,我不知道如何修复

这里同时存在两个问题:当试图移植到cmake时,我试图模仿我的makefile的工作方式。当我考虑如何将libxed嵌入到我的libcore中时,我以为我是在我的makefile中执行的,但事实并非如此,我是在将最终可执行文件与我的libcore和libxed链接起来。所以两个问题是:

  1. 如何将.a文件嵌入到另一个文件中
  2. 如何使用makefile

这里回答了第一个问题。

我所做的是:

  1. 创建第一个库(在我的例子中是libxed.a)
  2. 使用ar的-x选项提取第一个库的.o文件(在我的例子中是ar -x <path to libxed.a>/libxed.a
  3. 使用所有.o文件创建新的lib:ar -x *.o

我必须完成所有这些步骤,因为编译xed的过程有点奇怪,而且很难提前知道要包含的源文件

我仍然不知道如何在CMake中以可移植的方式模仿这种行为,但如果有必要,它将用于StackOverflow上的另一篇帖子,所以我将把它标记为已接受的答案

最新更新