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

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

本文关键字:使用 Boehm GC 链接 何正确 CMake      更新时间:2023-10-16

我一直在试图解决这个问题一段时间,但似乎无法让它工作。我已经检查了一堆帖子。

我有一个静态库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 调用来创建可执行文件,因此第一个项目中RuntimeCMake 目标的属性是未知的。具体来说,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})