如何正确 link 到 CMake 中的库(使用 Boehm GC)?

How to properly link to libraries in CMake (using Boehm GC)?

一段时间以来,我一直在努力解决这个问题,但似乎无法让它发挥作用。我已经检查了一堆帖子。

我有一个静态库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':

提前致谢

因为您使用 单独的 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})