在cmake命令行上指定include目录

Olu*_*ide 26 cmake include command-line-arguments

是否可以在运行时指定包含目录cmake.例如

cmake . -INCLUDE=/foo/bar
Run Code Online (Sandbox Code Playgroud)

头文件与我想要编译的源代码位于一个单独的目录中,我想在不修改Makefile生成的情况下解决这个问题cmake.

更新

该项目确实有一个CMakeLists.txt.摘抄:

INCLUDE_DIRECTORIES(${EO_SOURCE_DIR}/src)
INCLUDE_DIRECTORIES(${EO_SOURCE_DIR}/src/ga)
INCLUDE_DIRECTORIES(${EO_SOURCE_DIR}/src/utils)
Run Code Online (Sandbox Code Playgroud)

可以${EO_SOURCE_DIR}从命令行设置吗?

Fra*_*ser 11

如果标题的路径相对于您的源是固定的,那么您应该能够避免必须通过命令行传递此信息.

说你的项目的目录结构是:

/CMakeLists.txt
/my_sources/main.cpp
/my_sources/foo.cpp
/my_includes/foo.hpp
Run Code Online (Sandbox Code Playgroud)

在你的CMakeLists.txt中,你现在有类似的东西:

add_executable(MyExe my_sources/main.cpp my_sources/foo.cpp)
Run Code Online (Sandbox Code Playgroud)

然后将/my_includes文件夹添加到包含搜索路径列表中,您只需添加以下内容:

include_directories(my_includes)
Run Code Online (Sandbox Code Playgroud)


有关详细信息include_directories,请运行

cmake --help-command include_directories
Run Code Online (Sandbox Code Playgroud)

回答有问题的更新:

是的,使用-D命令行选项就行了

cmake . -DEO_SOURCE_DIR:PATH=<Path to required dir>
Run Code Online (Sandbox Code Playgroud)

该变量因此而${EO_SOURCE_DIR}被缓存,因此您只需要-D一次该参数(除非所需的路径发生更改或删除了您的CMakeCache文件等)


arr*_*owd 8

正确的方法是在CMakeLists.txt中定义一个变量并要求用户设置它:

set(YOURLIB_INCLUDE_DIR "" CACHE FILEPATH "Path to yourlib includes")

if(NOT EXISTS ${YOURLIB_INCLUDE_DIR}/header.h)
  message(SEND_ERROR "Can't find header.h in ${YOURLIB_INCLUDE_DIR})
endif()

include_directories(${YOURLIB_INCLUDE_DIR})
Run Code Online (Sandbox Code Playgroud)

现在您可以从命令行设置它: cmake -D YOURLIB_INCLUDE_DIR=/path/to/yourlib/include .

  • 尝试列出目录,用`;`分隔它们. (2认同)