【问题标题】:Cmake undefined reference when linking with a library that uses another library built with a Python script与使用 Python 脚本构建的另一个库的库链接时,Cmake 未定义引用
【发布时间】:2021-11-23 20:32:13
【问题描述】:

我是 cmake 的新手,我正在尝试移植我以前使用手写 makefile 构建的项目。可执行文件使用我构建的需要 lib“xed”(由英特尔编写)的 lib“核心”。 Xed 使用 python 脚本构建,因此在 CMakeLists 中构建我的 lib 核心,我使用“add_custom_command”按照 intel 提供的instructions 构建 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)

问题是当我将我的最终产品与我的库“libcore.a”链接时,我有很多未定义的对 xed 函数的引用,我不知道如何解决这个问题

【问题讨论】:

  • 需要更多细节,或最小的可重现示例。链接最终产品的命令在哪里?您如何告诉 CMake 在链接时包含自定义构建的 libxed?
  • 对不起,我很忙,我的问题没有解决,但我知道它来自哪里,我发布一个答案来解释它

标签: c++ cmake undefined-reference


【解决方案1】:

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

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

第一个问题回答here

我所做的是:

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

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

我仍然不知道如何在 CMake 中以可移植的方式模仿这种行为,但如有必要,它将在 StackOverflow 上发布另一篇文章,因此我会将其标记为已接受的答案

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 2019-06-24
    • 2019-02-12
    • 2012-11-19
    • 2015-01-24
    • 2020-08-10
    • 2017-05-10
    • 2021-01-01
    • 2011-08-08
    相关资源
    最近更新 更多