CMake:库未创建

时间:2019-03-22 22:07:03

标签: cmake dependencies subdirectory

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

A

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

[1)这样是否可以确保C先被Cake,然后B被Cake? ]

B

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

C

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

我在构建时遇到错误,提示未找到软件包c。

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

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

1 个答案:

答案 0 :(得分:0)

  

这是否确保C先被cmake,然后B?

不。它无法确保甚至没有CB项目,也无法确保它们将完全构建。它只是以一种特殊的方式来获取/包含C/CMakeLists.txtB/CMakeLists.txt文件,仅此而已。

  

add_library(C共享./* c)

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

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

add_library无法理解小球。

  

pkg_check_modules(C_LIB必填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

也许可以这样尝试:

A

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

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