CMake无法找到包含文件。

38

我有一个布局如下的项目:

   /build
   /source
        +--- CMakeLists.txt
        |
        +--- /bin
        |      +--CMakefiles.txt
        |      +--main.cpp
        |
        +--- /jsoncpp
        |       +--- /json
        |       |       +--json.h
        |       |       +--json-forwards.h
        |       |
        |       +--jsoncpp.cpp
        |       +--CMakeLists.txt
        |
        +--- /jsonreader
                 +-- jsonreader.cpp
                 +-- jsonreader.h
                 +-- CMakeLists.txt

在/source/CMakeLists.txt文件中,我有这样一行代码;

include_directories(jsoncpp jsonreader)

但是在构建目录中运行 'cmake -G "MSYS Makefiles" ../source' 会生成Makefile,然后运行'make'会生成以下错误:

但是在构建目录中运行 'cmake -G "MSYS Makefiles" ../source' 会生成Makefile,然后运行'make'会生成以下错误:

Scanning dependencies of target updater
[ 33%] Building CXX object bin/CMakeFiles/updater.dir/main.cpp.obj
In file included from k:/own-projects/updater-Project/withJsonCpp/source/bin/main.cpp:2:0:
../source/jsonreader/jsonreader.h:2:18: fatal error: json.h: No such file
or directory
compilation terminated.
make[2]: *** [bin/CMakeFiles/updater.dir/main.cpp.obj] Error 1
make[1]: *** [bin/CMakeFiles/updater.dir/all] Error 2
make: *** [all] Error 2

我做错了什么,如何解决这个问题?


你不应该将jsoncpp/json添加到你的包含文件中吗?或者在你的C++文件中使用相对路径? - drescherjm
@drescherjm:在我的C++代码中,我只使用“include”header.h”,无论头文件的位置如何,这样做有问题吗?添加jsoncpp/json不起作用。 - Amani
我相信你想要在包含路径前缀中加上 ${CMAKE_SOURCE_DIR}。 - drescherjm
1
@drescherjm:这与您的第一条评论配合使用。如果您不介意,请将其作为一个正确的答案,谢谢。 - Amani
2个回答

40

存在两个问题。首先,您需要将jsoncpp / json路径添加到已包含的目录中。但是,这样做会产生第二个问题。由于您的可执行文件不在源文件夹中,因此您需要在路径前加上${CMAKE_SOURCE_DIR},使include_directories()看起来像下面这样:

存在两个问题。首先,您需要将jsoncpp/json路径添加到您的已包含目录中。然而,这样做会带来第二个问题。由于您的可执行文件不在源文件夹中,所以您需要在路径前面添加${CMAKE_SOURCE_DIR},使得include_directories()看起来像下面这样:

include_directories("${CMAKE_SOURCE_DIR}/jsoncpp"
    "${CMAKE_SOURCE_DIR}/jsoncpp/json"
    "${CMAKE_SOURCE_DIR}/jsonreader")

我只是出于习惯才加了引号。在我的 CMakeLists.txt 中,我大部分时间都这样做,以避免路径中出现空格而产生问题。


2
我通过 ROS 项目找到了这个答案。对于潜在的未来访客,我需要 include_directories(include) - Jacksonkr
2
我之前使用的是CMAKE_CURRENT_SOURCE_DIR而不是CMAKE_SOURCE_DIR,这是我的错误。 - perezmlal

10

Amani,

看起来你在包含"json.h"时没有使用它的相对路径。你可以这样包含它:

#include "json/json.h"

或者,在您的CMakeLists.txt文件中,将json目录添加到包含目录中:
include_directories(jsoncpp jsoncpp/json jsonreader)

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