【问题标题】:Link a static library to object in cmake将静态库链接到 cmake 中的对象
【发布时间】:2021-05-17 23:57:07
【问题描述】:

我正在尝试使用 cmake 编译一个项目。我需要在src1.c 中使用外部静态库,所以我利用target_link_libraries 将其链接到目标文件。但是,我收到一些关于 src1.c 中缺少函数的抱怨,这些函数应该在外部库中。

add_library(input_output OBJECT
        src/src1.c
        src/src2.c
        src/src3.c)

find_library(EXTERNAL_LIB NAMES libexternallib.a PATHS ~/lib)

target_link_libraries(input_output PRIVATE
        "${EXTERNAL_LIB}")

所以我不确定此时我应该做什么。至少逻辑听起来是对的

UPDATE1:我还将外部库直接添加到链接器命令中

add_compile_options(-Wall -Wextra --std=c99 -L~/lib -lexternallib)
add_link_options(-L~/lib -lexternallib)

但这会在链接器命令的目标文件之前添加库标志,这会导致ordering the linker arguments 出现其他问题

【问题讨论】:

  • 请在问题帖子中添加确切的错误消息
  • src1.c:(.text+0x3c): undefined reference to `some_function' collect2: error: ld returned 1 exit status
  • 错误“未定义的引用”只能在链接可执行文件或共享库时发出。 OBJECT 库的创建不涉及链接,因此它不会发出给定的错误。请提供您的案例更详细的描述
  • 正确,当我想将 input_output 链接到可执行目标时会出现问题:add_executable(my_app app/main_app.c) target_link_libraries(my_app input_output)

标签: gcc cmake


【解决方案1】:

这里很难说你的错误的真正原因是什么,但我会试一试。

首先,您不需要使用 add_compile_options 或 add_link_options 手动链接。 cmake 命令 target_link_libraries 正在为您执行此操作。

我可以想象,由于缺少函数,您需要从依赖项中添加一个头包含目录。

例如:

target_include_directories(input_output PRIVATE /path/to/external_library_header)

【讨论】:

  • 我已经添加了头文件,问题其实不是编译!主要问题是链接器
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
相关资源
最近更新 更多