g++“忽略不存在的目录”,但实际上存在(仅适用于 CLion + Ninja)

问题描述 投票:0回答:1

我有一些 C++ 源代码,其中包括以下行:

#include <Eigen/Core>

编译在这一行失败,并出现错误:(为简洁起见,我的源文件名/路径已被编辑。)

In file included from ___.h:8,
                 from ___.cpp:1:
____.hpp:5:10: fatal error: Eigen/Core: No such file or directory
    5 | #include <Eigen/Core>
      |          ^~~~~~~~~~~~~~~~~~~
compilation terminated.

奇怪的是,从命令行构建它(甚至使用 CLion 生成的 Ninja 文件)工作正常。

我的 CMakeLists.txt 包含以下内容:

include_directories("/usr/local/include" "/usr/local/opt/llvm/include"
        "/usr/include/eigen3" "/usr/include/eigen3/unsupported"
        "include/" "include/minidnn" )

最相关的是两条与特征相关的路径。在

/usr/include/eigen3
下是(我已经三重检查)一个名为
Eigen
的文件夹,其中有一个名为
Core
的文件。这就是我相信这个构建系统应该起作用的原因。如前所述,当通过 CLion 构建时,这确实有效。

为了尝试调试此问题,我将

--verbose
添加到 g++ 标志中。这是结果:

ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/include-fixed/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/../../../../x86_64-unknown-linux-gnu/include"
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory "/usr/local/opt/llvm/include"
ignoring nonexistent directory "/usr/include/eigen3"
ignoring nonexistent directory "/usr/include/eigen3/unsupported"
#include "..." search starts here:
#include <...> search starts here:
 /home/garby/Documents/code/cpp/shared-memory-sgd/include
 /home/garby/Documents/code/cpp/shared-memory-sgd/include/minidnn
 /usr/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/../../../../include/c++/13.2.0
 /usr/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/../../../../include/c++/13.2.0/x86_64-unknown-linux-gnu
 /usr/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/../../../../include/c++/13.2.0/backward
 /usr/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/include
 /usr/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
Compiler executable checksum: 783eab82059e8c1c7db8dfb100492c35
In file included from /home/garby/Documents/code/cpp/shared-memory-sgd/include/minidnn/NetworkExecutor.h:8,
                 from /home/garby/Documents/code/cpp/shared-memory-sgd/semisync.cpp:1:
/home/garby/Documents/code/cpp/shared-memory-sgd/include/minidnn/ParameterContainer.h:5:10: fatal error: Eigen/Core: No such file or directory
    5 | #include <Eigen/Core>
      |          ^~~~~~~~~~~~
compilation terminated.

这看起来很奇怪。 g++ 声称“不存在”的大多数目录确实存在。例如,存在

/usr/local/include
/usr/include/eigen3
。这些文件/目录的权限看起来也可以接受:

drwxr-xr-x 1 root root 100 Feb  2  2022 /usr/include/eigen3/
drwxr-xr-x 1 root root 584 Feb  2  2022 /usr/include/eigen3/Eigen/
-rw-r--r-- 1 root root 12799 Feb  2  2022 /usr/include/eigen3/Eigen/Core

为了完整起见,以下是 Ninja(在 CLion 下)失败之前调用的完整命令。

/usr/bin/g++  -I/usr/local/include -I/usr/local/opt/llvm/include -I/usr/include/eigen3 -I/
usr/include/eigen3/unsupported -I/home/garby/Documents/code/cpp/shared-memory-sgd/include 
-I/home/garby/Documents/code/cpp/shared-memory-sgd/include/minidnn -fopenmp -g --verbose 
-std=gnu++20 -fdiagnostics-color=always -MD -MT CMakeFiles/mininn.dir/semisync.cpp.o 
-MF CMakeFiles/mininn.dir/semisync.cpp.o.d -o CMakeFiles/mininn.dir/semisync.cpp.o 
-c /home/garby/Documents/code/cpp/shared-memory-sgd/semisync.cpp

如果我从终端手动运行此命令,该源文件将正确构建(!)我相信,这是问题的症结所在。在路径解析方面,CLion 一定做了一些奇怪的事情。它是否在某种容器内执行?...

(在写这篇文章时,我发现了答案。无论如何,我都会发布问题,并发布答案,以防其他人遇到同样的问题。)

c++ eigen clion eigen3 flatpak
1个回答
0
投票

就在我写到 CLion 好像在某种容器中运行时,我想起也许我是用 flatpak 安装的。我通常会尝试避免使用 Flatpak(正是由于此类问题),但这里确实是这种情况。

Flatpak 限制应用程序可以访问哪些目录,在这种情况下过于严格。这解释了 g++ 找不到包含目录。

理论上,我认为解决这个问题的方法可以是以下:

flatpak override --filesystem=host com.jetbrains.CLion

虽然这对我不起作用......我的解决方案是卸载 flatpak 的 CLion 并从下载的 tar 中运行它,我也不喜欢。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.