我有一个项目目录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中缺少什么?
这是否确保C首先是cmake(ed)然后是B?
不。它不能确保甚至有C
和B
项目,并且它不能确保它们将构建。它只是来源/包括(以特殊方式)C/CMakeLists.txt
和B/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)
或者更好地尝试总是明确告诉PUBLIC
或PRIVATE
或INTERFACE
:
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