CMake:未创建库

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

我有一个项目目录A,它有子目录B和C.我希望C作为共享对象库,让B使用它。 CMakeLists.txt看起来如下 -

一个

...
add_subdirectory(C)
add_subdirectory(B)
...

[1]这是否确保C首先是cmake(ed)然后是B? ]

...
pkg_check_modules(C_LIB REQUIRED C)
target_link_libraries(B C_LIB)
...

C

...
add_library (C SHARED ./*c)
...

我在构建中遇到错误,说没有找到包c。

但是,如果我在与A相同的层次结构中有目录C,我可以正确地获得B和C的链接。

我想将我的代码放在A中,并使依赖项正确。我的CMakeLists.txt中缺少什么?

cmake dependencies subdirectory
1个回答
0
投票

这是否确保C首先是cmake(ed)然后是B?

不。它不能确保甚至有CB项目,并且它不能确保它们将构建。它只是来源/包括(以特殊方式)C/CMakeLists.txtB/CMakeLists.txt文件,这就是全部。

add_library(C SHARED ./*c)

这是无效的,除非您有一个名为*c的源文件。你要:

file(GLOB sources ./*c)
add_library(C SHARED ${sources})

add_library不理解globulations。

pkg_check_modules(C_LIB REQUIRED C) target_link_libraries(B C_LIB)

这很奇怪。你没有名为“C”的pkg-config模块吗?你可能想要:

 target_link_libraries(B C)

或者更好地尝试总是明确告诉PUBLICPRIVATEINTERFACE

target_link_libraries(B PUBLIC C)

这将确保B的接口包含添加到C的路径(或将会?),并且当使用B构建可执行文件时,C与之链接。它并不意味着“在C之前建立B”意味着:使用C的界面来构建B

也许尝试这样:

一个

cmake_minimum_required(VERSION 3.14)
project(A)
add_subdirectory(C)
add_subdirectory(B)

cmake_minimum_required(VERSION 3.14)
project(B)
add_executable(B ./source1.c)
target_link_libraries(B PUBLIC C)

C

cmake_minimum_required(VERSION 3.14)
project(C)
add_library(C SHARED sourcec.c)
target_include_directories(C PUBLIC ./) # so when compiling B it uses this include dir
© www.soinside.com 2019 - 2024. All rights reserved.