如何在Linux中强制cmake使用/usr/include中的c++头文件?

How can I force cmake to use C++ header files in /usr/include in Linux?

本文关键字:include usr 中的 文件 c++ 使用 Linux cmake      更新时间:2023-10-16

我有一个cmake项目,它使用安装在/usr/include中的头文件,让我们称之为freeglut.h。当我用find_package(GLUT)时,我得到${GLUT_INCLUDE_DIR}指向/usr/include。终成眷属。

现在,我正在添加CUDA,它在find_package(CUDA)包含的路径之一中保留了这些和其他头文件的副本。通常我会通过将${GLUT_INCLUDE_DIR}放在include_directories()中的${CUDA_INCLUDE_DIRS}之前来解决这个问题。然而,在Unix系统上,cmake在UnixPaths.cmake中维护了一个名为CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIESlist,其中包含/usr/include,并且显然阻止cmake为目录/usr/include的编译器发出-I<dir>参数,这意味着编译器首先搜索CUDA路径,并使用那里找到的freeglut.h头。

我已经尝试使用list(REMOVE_ITEM ...CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES列表中删除/usr/include,但这并没有改变cmake制作的编译器命令。

我当然可以开始破解CUDA安装,删除我不想要的头,或修改CUDA_INCLUDE_DIRS变量,但是是否有一个干净的方法来告诉cmake首先使用系统头文件,如果它们存在?

我想-idirafter标志应该可以帮助你:

- dir

在dir中搜索头文件,但要在使用-I指定的所有目录和标准系统目录都有头文件之后执行被耗尽。Dir被视为系统包含目录。

https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

您可以像这样使用它来降低CUDA包含dirs的优先级:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -idirafter /usr/include/<CUDA_includes>")
相关文章: