我有一个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_DIRECTORIES
的list
,它包含/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_DIRS
variables,但是有没有一种方法可以告诉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>")