【问题标题】:cmake linking libraries with internal dependencycmake链接库与内部依赖
【发布时间】:2021-07-03 16:25:16
【问题描述】:

首先,我不确定我设置项目的方式是否正确,但就是这样,

一个名为 Lib 的 cmake 项目有两个子目录 Animal 和 Dog。两者都是静态库,但 Dog 依赖于 Animal。

Lib 的 CMakeLists.txt

cmake_minimum_required(VERSION 3.16.3)

project(Lib VERSION 1.0.0 DESCRIPTION "My package." LANGUAGES CXX)

add_subdirectory(Animal)
add_subdirectory(Dog)

install(EXPORT LibConfig
    FILE LibConfig.cmake
    NAMESPACE Lib::
    DESTINATION lib/Lib/cmake
    )

动物/CmakeLists.txt

set(TARGET_NAME Animal)

add_library(${TARGET_NAME}
    src/Animal.cpp
    )

target_include_directories(${TARGET_NAME} PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
    )

install(TARGETS ${TARGET_NAME} EXPORT LibConfig
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
    )

install(DIRECTORY include/
    DESTINATION include/${TARGET_NAME}
    FILES_MATCHING PATTERN "*.hpp")

狗/CMakeLists.txt。我不确定如何依赖 Animal。

set(TARGET_NAME Dog)

add_library(${TARGET_NAME}
    src/Dog.cpp
    )

target_include_directories(${TARGET_NAME}
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
    PRIVATE
    $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/Animal/include>
    )

target_link_libraries(${TARGET_NAME}
    PRIVATE
    Animal
    )

install(TARGETS ${TARGET_NAME} EXPORT LibConfig
    ARCHIVE DESTINATION lib
    LIBRARY DESTINATION lib
    RUNTIME DESTINATION bin
    )

install(DIRECTORY include/
    DESTINATION include/${TARGET_NAME}
    FILES_MATCHING PATTERN "*.hpp")

这使用了库。

cmake_minimum_required(VERSION 3.10.2)

project(UseLib)

find_package(Lib REQUIRED)

add_executable(${PROJECT_NAME}
    main.cpp
    )

target_link_libraries(${PROJECT_NAME}
    Lib::Dog
    )

main.cpp

#include <Dog/Dog.hpp>

int main()
{
    Dog d;
    return 0;
}

这些库编译得很好,但是当我在项目中使用它时,我收到一条错误消息,说 Dog 找不到 Animal 标头。

.../include/Dog/Dog.hpp:3:10: fatal error: Animal.hpp: No such file or directory
 #include "Animal.hpp"
          ^~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/UseLib.dir/build.make:63: CMakeFiles/UseLib.dir/main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/UseLib.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

【问题讨论】:

  • 为什么要执行PRIVATE 链接-target_link_libraries(${TARGET_NAME} PRIVATE Animal)-如果Animal.hpp 实际上包含在Dog 库的接口 中? (库Dog 具有接口头Dog.hpp。由于该头包含Animal.hpp,因此Animal.hpp 也是Dog 的接口。)请改用PUBLIC 链接。

标签: cmake


【解决方案1】:

Dog 没有找到 Animal,因为在 Dog.hpp 我有 #include "Animal.hpp",但我在它自己的子目录中安装了标头,所以外部项目以这种方式包含它 #include &lt;Animal/Animal.hpp&gt;。这是我不明白的事情。

target_include_directories(${TARGET_NAME}
        PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include>
        $<INSTALL_INTERFACE:include/Animal>
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多