Cmake在使用target_include_directories时无法指定包含目录。

15

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

这是我的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,但是我不知道错在哪里。


1
在应用命令 target_include_directories(**target_name** ...)target_link_libraries(**target_name** ...) 之前,您需要先定义一个目标。目标是通过 add_libraryadd_executable 命令创建的。 - vre
谢谢,你能加上一个最小的例子吗?因为我对cmake还不熟悉。 - vincenzopalazzo
如果你想在编译 SpyCBlock 可执行文件时指定包含目录,使用该可执行文件的名称作为 target_include_directories 调用的第一个参数:target_include_directories(SpyCBlock PUBLIC include/rapidjson/include) - Tsyvarev
使用这段代码可以通过 #include<WrapperRapidJson.h> 调用 include,如果该文件位于 include/rapidjson/include/WrapperRapidJson.h 中对吗? - vincenzopalazzo
1个回答

19

我希望你可以将评论中建议的解决方案添加到这个问题中,该代码有两个问题:

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>


1
在名为“include”的目录下应该有.cpp文件吗? - Max Barraclough
嗨@MaxBarraclough,在这种情况下,目录包含的不是文件blk,而是项目的某个库。 - vincenzopalazzo
@vincenzopalazzo,我没有看到你对Max Barraclough的评论回复。你的include目录中包含.cpp文件吗?谢谢。 - Yug Singh
@YugSingh 是的,在include目录中有一个完整的项目,包括.cpp和.hpp文件。 - vincenzopalazzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接