【问题标题】:How to properly link to libraries in CMake (using Boehm GC)?如何正确链接到 CMake 中的库(使用 Boehm GC)?
【发布时间】:2020-05-12 14:25:53
【问题描述】:

我一直在尝试解决这个问题,但似乎无法让它发挥作用。我已经检查了一堆帖子。

我有一个静态库 libRuntime.a,生成如下:

cmake_minimum_required(VERSION 3.15)
project(Runtime)

set(CMAKE_CXX_STANDARD 17)

add_library(Runtime library.cpp)
find_library(GC gc)
message(${GC})
target_link_libraries(Runtime PUBLIC ${GC})

library.cpp 使用 Boehm GC,这就是为什么我还将它与我的 Runtime 目标链接。

现在,我想从我的 libRuntime.a 中调用函数,所以我有以下其他 CMake 项目:

cmake_minimum_required(VERSION 3.15)
project(test)

set(CMAKE_CXX_STANDARD 17)

add_executable(test main.cpp)
find_library(TESTLIB Runtime lib)
message(${TESTLIB})
target_link_libraries(test ${TESTLIB})

我已将 library.h 粘贴到项目中,并将 libRuntime.a 粘贴到名为 lib 的目录中,因此定义已知并找到库。从我的运行时库调用函数现在给了我:

/path.../Scheme-Compiler/Runtime/library.cpp:12: undefined reference to `GC_init'
/usr/bin/ld: ../lib/libRuntime.a(library.cpp.o): in function `alloc_atom':

提前致谢

【问题讨论】:

    标签: c++ cmake linker static-libraries


    【解决方案1】:

    因为您使用单独 CMake 调用来创建可执行文件,所以您的第一个项目中Runtime CMake 目标的属性是未知的。具体来说,CMake 不会知道 Runtime 库的任何依赖项(即 GC),因此在将 Runtime 链接到可执行文件时必须明确列出它们:

    cmake_minimum_required(VERSION 3.15)
    project(test)
    
    set(CMAKE_CXX_STANDARD 17)
    
    add_executable(test main.cpp)
    find_library(TESTLIB Runtime lib)
    message(${TESTLIB})
    
    # Find GC library.
    find_library(GC gc)
    # Link GC here, along with the Runtime library.
    target_link_libraries(test PRIVATE ${GC} ${TESTLIB})
    

    【讨论】:

    • 这行得通,谢谢。我以为我将 gc 添加到了我的运行时。它不是因为它是一个共享库而起作用吗,或者为什么?
    • @TimEichholz libRuntime.a 是一个静态库。您无法将任何内容链接到 static library。它只是一个目标文件的存档。它的生产不涉及任何联系。即使它是共享库,它对libgc 的依赖仍然会成为你的可执行文件的依赖。
    • @TimEichholz Mike 的评论是正确的;您仍然需要显式链接 GC 库。但是,如果您将这两个 CMake 项目合并为一个,CMake 会为您跟踪Runtime库的依赖关系,因此您只需需要提及@987654330为您的可执行文件调用target_link_libraries() 时的@target。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    相关资源
    最近更新 更多