Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确链接到CMake中的库(使用Boehm GC)?_C++_Cmake_Linker_Static Libraries - Fatal编程技术网

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

C++ 如何正确链接到CMake中的库(使用Boehm GC)?,c++,cmake,linker,static-libraries,C++,Cmake,Linker,Static Libraries,我想弄明白这一点已经有一段时间了,但似乎无法让它发挥作用。我已经查过很多帖子了 我有一个静态库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 PUB

我想弄明白这一点已经有一段时间了,但似乎无法让它发挥作用。我已经查过很多帖子了

我有一个静态库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,这就是为什么我还要将它与我的
运行时
目标链接

现在,我想从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调用来创建可执行文件,所以您的第一个项目中的
运行时
CMake目标的属性是未知的。具体而言,CMake不知道
运行时
库的任何依赖项(即
GC
),因此在将
运行时
链接到可执行文件时,必须明确列出它们:

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
是一个静态库。您无法将任何内容链接到。它只是对象文件的存档。它的生产不涉及任何联系。即使它是共享库,它对
libgc
的依赖仍然会成为可执行文件的依赖。@TimEichholz-Mike的评论是正确的;您仍然需要显式链接GC库。但是,如果将这两个CMake项目合并为一个,CMake将为您跟踪
运行时
库的依赖关系,因此在调用可执行文件的
目标链接库()
时,您只需提及
运行时
目标。