首页 > 解决方案 > Cmake使用目标target_include_directories时无法指定包含目录

问题描述

我在我的项目中使用子模块 GitHub,现在我想使用target_include_directoriesfor 将文件包含在我的项目类中

这是我的 cmake 配置

cmake_minimum_required(VERSION 3.9)
project(SpyCBlock)

set(CMAKE_CXX_STANDARD 14)

#bitcoin rpc lib
find_library(bitcoinapi 0.3 REQUIRED)

target_include_directories(rapidjson PUBLIC include/rapidjson/include)

target_include_directories(spycblockrpc PUBLIC include/spycblockrpc)

target_include_directories(btccryptography PUBLIC include/bitcoin-cryptography-library)

add_executable(

        ${PROJECT_NAME}

        #other inclusion file cpp

        #cpp-properties file include
        include/cpp-properties/src/Properties.cpp
        include/cpp-properties/src/PropertiesParser.cpp
        include/cpp-properties/src/PropertiesUtils.cpp

        #include bitcoin-cryptography-library
        include/bitcoin-cryptography-library/cpp/Sha256.cpp
        include/bitcoin-cryptography-library/cpp/Sha256Hash.cpp
        include/bitcoin-cryptography-library/cpp/Utils.cpp

        #include spycblocrpc
        include/spycblockrpc/core/graph/TransactionGraph.cpp
        include/spycblockrpc/core/graph/WrapperInformations.cpp
        include/spycblockrpc/ConfiguratorSingleton.cpp

        include/spycblockrpc/commands/DecodeScriptCommand.cpp
        include/spycblockrpc/commands/DecodeRawTransaction.cpp
        include/spycblockrpc/commands/HeightBlockchainCommand.cpp
        include/spycblockrpc/commands/DecodeBlockAtIndexCommand.cpp

)

#bitcoin rpc lib
target_link_libraries(SpyCBlockTests bitcoinapi)
target_link_libraries(${PROJECT_NAME} bitcoinapi)

运行 CMake 时出现此错误

Starting to parse CMake project.
CMake Error at CMakeLists.txt:20 (target_include_directories):
  Cannot specify include directories for target "rapidjson" which is not
  built by this project.


CMake Error at CMakeLists.txt:22 (target_include_directories):
  Cannot specify include directories for target "spycblockrpc" which is not
  built by this project.


CMake Error at CMakeLists.txt:24 (target_include_directories):
  Cannot specify include directories for target "btccryptography" which is
  not built by this project.


CMake Error at CMakeLists.txt:26 (target_compile_definitions):
  Cannot specify compile definitions for target "cppproperties" which is not
  built by this project.

我是 C++ 和 cmake 的新手,我不明白我错了什么

标签: c++cmake

解决方案


我想添加这个问题的解决方案,正如评论中所建议的,代码有两个问题:

target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/include/rapidjson/include)
  1. 目标的第一个参数必须是可执行文件的名称,所以在这种情况下,是 SpyCBlock
  2. 第二个问题是在声明目标之前定义目标,target_include_directories(SpyCBlock ...)定义在目标之前add_executable(${PROJECT_NAME} ...)

一个最小的正确示例是:

add_executable(
    ${PROJECT_NAME}
        
    #other inclusion file cpp
        
    #cpp-properties file include
    include/cpp-properties/src/Properties.cpp
    include/cpp-properties/src/PropertiesParser.cpp
    include/cpp-properties/src/PropertiesUtils.cpp

    #include bitcoin-cryptography-library
    include/bitcoin-cryptography-library/cpp/Sha256.cpp
    include/bitcoin-cryptography-library/cpp/Sha256Hash.cpp
    include/bitcoin-cryptography-library/cpp/Utils.cpp

    #include spycblocrpc
    include/spycblockrpc/core/graph/TransactionGraph.cpp
    include/spycblockrpc/core/graph/WrapperInformations.cpp
    include/spycblockrpc/ConfiguratorSingleton.cpp

    include/spycblockrpc/commands/DecodeScriptCommand.cpp
    include/spycblockrpc/commands/DecodeRawTransaction.cpp
    include/spycblockrpc/commands/HeightBlockchainCommand.cpp
    include/spycblockrpc/commands/DecodeBlockAtIndexCommand.cpp
)
        
target_include_directories(${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/include/rapidjson/include)

现在我可以像这样包含库<bitcoin-cryptography-library/Sha256.h>


推荐阅读