CMake将仅标题库包含到另一个库中,make失败

zpgglvta  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(154)

我有以下文件夹结构:

- lib/
    -libA/
        -include/
            - libA.h
        -src/
            - libA.cpp
        -CMakeLists.txt (1)
    -libB/
        -headerB1.h
        -headerB2.h
        -headerBx.h
        -CMakeLists.txt (2)
 - src/
    -main.cpp
 - CMakeLists.txt (3)

在libA. h中,我尝试包含libB中的一个头文件。在本例中,该头文件将是headerB 1. h,方法是执行

#include <headerB1.h>

但不幸的是,我在cmake中遇到以下错误:致命错误C1083:无法打开包含文件:“标题B1.h”:libA.h文件中没有此类文件或目录。
我有以下CMake内容:(3)第三章:

cmake_minimum_required(VERSION 3.10)

project(project)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

set(SOURCES 
    src/main.cpp
)

add_executable(${PROJECT_NAME} ${SOURCES})

add_subdirectory("lib/libA")
add_subdirectory("lib/libB")

target_link_libraries(${PROJECT_NAME} PUBLIC libA)
target_link_libraries(${PROJECT_NAME} PUBLIC libB)

(1)请输入您的密码。

add_library(libA STATIC)

target_sources(libA PRIVATE src/libA.cpp)
target_include_directories(libA
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
)

(2)使用的语言

add_library(libB INTERFACE)
target_include_directories(libB INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

在我看来,库B(libB)是一个只有头文件的库(如果我用错了术语,请纠正我)。所以libA实际上“使用”了libB,但不知何故,添加或创建libB并没有像我想象的那样执行。我在这里有什么误解?我该如何解决?
main.cpp:

#include <libA.h> //This works!

int main(void) {
    //do something with libA class / functions
}

libA.h:

#include <headerB1.h> //This causes the cmake (mingw32-make.exe) error

我用途:

  • 制造
  • 对编码
  • mingw 32-制造

我其实确实看了一下:CMake include library in another library但是不幸的是,让我的CMakeLists(1)像下面的代码一样对我不起作用。或者,再次,我误解了解决方案。

add_library(libA SHARED)

target_sources(libA PRIVATE src/libA.cpp)
target_include_directories(libA
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
)
target_link_libraries(libA PRIVATE libB)
target_include_directories(libA PUBLIC ${CMAKE_ROOT}/lib/libB)
lp0sw83n

lp0sw83n1#

好的,这实际上是一个非常简单的解决方案,但它确实有意义的是,libB必须首先编译,因为libA使用它。
因此,在CMakeLists.txt(3)中,我将以下两行进行了切换:

add_subdirectory("lib/libA")
add_subdirectory("lib/libB")

add_subdirectory("lib/libB")
add_subdirectory("lib/libA")

我还确保已经将下面的代码片段添加到libA CMakeLists.txt(1)中,就像在另一个stackoverflow问题中建议的那样。CMake include library in another library

target_link_libraries(libA PRIVATE libB)
target_include_directories(libA PUBLIC ${CMAKE_ROOT}/lib/libB)

现在,所有的编译都如预期一样,没有错误。

相关问题