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

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

现在,我添加了CUDA,它将这些和其他头文件的副本保存在find_package(CUDA)包含的path之一中。 通常我会通过在include_directories() ${GLUT_INCLUDE_DIR}之前放置${GLUT_INCLUDE_DIR}来解决这个问题。 但是,在Unix系统上,cmake在UnixPaths.cmake中维护一个名为CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIESlist ,它包含/usr/include ,显然保持cmake不会为目录/usr/include的编译器发出-I<dir>参数,编译器首先searchCUDApath,然后使用在那里find的freeglut.h头文件。

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

我当然可以开始使用CUDA安装,删除我不想要的头文件,或者修改CUDA_INCLUDE_DIRSvariables,但是有没有一种方法可以告诉cmake首先使用系统头文件?

我想-idirafter国旗应该可以帮助你:

-idirafter dir

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

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

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

 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -idirafter /usr/include/<CUDA_includes>")