链接到使用另一个库的库时,Cmake undefined reference 使用 Python 脚本构建
Cmake undefined reference when linking with a library that uses another library built with a Python script
我是 cmake 的新手,我正在尝试移植我以前使用手写 makefile 构建的项目。可执行文件使用我构建的库“核心”,它需要英特尔提供的库“xed" (written by intel). Xed uses a python script to be built so in the CMakeLists to build my lib core, I used an "add_custom_command" to build xed following the instructions:
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)
问题是当我将我的最终产品与我的库“libcore.a”链接时,我有很多未定义的函数引用,我不知道如何解决这个问题
这里同时存在两个问题:在尝试移植到 cmake 时,我试图模仿我的 makefile 的工作方式。当我考虑如何将 libxed 嵌入到我的 libcore 中时,我以为我是在我的 makefile 中这样做的,但我没有,我是将最终的可执行文件与我的 libcore 和 libxed 链接起来。所以这两个问题是:
- 如何将 .a 文件嵌入到另一个文件中
- 如何使用生成文件
第一个问题已回答here。
我做的是:
- 创建第一个库(在我的例子中 libxed.a)
- 使用
ar
的 -x 选项提取第一个库的 .o 文件(在我的例子中 ar -x <path to libxed.a>/libxed.a
- 使用所有 .o 文件创建新库:
ar -x *.o
我必须执行所有这些步骤,因为编译 xed 的过程有点奇怪,而且很难提前知道要包含哪个源文件
我仍然不知道如何以可移植的方式在 CMake 中模仿这种行为,但如果有必要,它将用于 Whosebug 上的另一个 post,因此我将其标记为已接受的答案
我是 cmake 的新手,我正在尝试移植我以前使用手写 makefile 构建的项目。可执行文件使用我构建的库“核心”,它需要英特尔提供的库“xed" (written by intel). Xed uses a python script to be built so in the CMakeLists to build my lib core, I used an "add_custom_command" to build xed following the instructions:
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)
问题是当我将我的最终产品与我的库“libcore.a”链接时,我有很多未定义的函数引用,我不知道如何解决这个问题
这里同时存在两个问题:在尝试移植到 cmake 时,我试图模仿我的 makefile 的工作方式。当我考虑如何将 libxed 嵌入到我的 libcore 中时,我以为我是在我的 makefile 中这样做的,但我没有,我是将最终的可执行文件与我的 libcore 和 libxed 链接起来。所以这两个问题是:
- 如何将 .a 文件嵌入到另一个文件中
- 如何使用生成文件
第一个问题已回答here。
我做的是:
- 创建第一个库(在我的例子中 libxed.a)
- 使用
ar
的 -x 选项提取第一个库的 .o 文件(在我的例子中ar -x <path to libxed.a>/libxed.a
- 使用所有 .o 文件创建新库:
ar -x *.o
我必须执行所有这些步骤,因为编译 xed 的过程有点奇怪,而且很难提前知道要包含哪个源文件
我仍然不知道如何以可移植的方式在 CMake 中模仿这种行为,但如果有必要,它将用于 Whosebug 上的另一个 post,因此我将其标记为已接受的答案