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

问题描述 投票:1回答:1

我已经尝试了一段时间,但似乎无法正常工作。我已经检查了很多帖子。

我有一个静态库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个回答
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})
© www.soinside.com 2019 - 2024. All rights reserved.