在Cmake模块中,我试图找到不同的路径。在某些情况下,我想在最初使用相同变量调用“find_path”后“设置”变量:
# general search for this include dir
find_path(LIBRARY_INCLUDE_DIR
NAMES LibraryName/LibraryHeader.h
)
# specific option enabled by user
if(USE_OTHER_LIB)
find_path(OTHER_LIB_ROOT_DIR
NAMES OtherLib/OtherLib.h
)
set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include)
endif(USE_OTHER_LIB)
这种方法在Windows XP(CMake 2.8.1)下运行良好。但是,它在Mac OS 10.6(CMake 2.8.3)下无效。有人知道mac / windows版本之间是否有区别以及如何解决这个问题?
非常感谢!
答案 0 :(得分:5)
这是关于“set”和CMake缓存变量的常见误解。
该行:
set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include)
为LIBRARY_INCLUDE_DIR设置一个本地覆盖值,该值对CMakeLists文件的其余处理生效,但它对同名的缓存变量没有影响。因此,在cmake-gui或ccmake缓存编辑程序中不可见。
如果你想让它可见,你必须强制它的值进入同名的缓存变量,可能是这样的:
set(LIBRARY_INCLUDE_DIR ${OTHER_LIB_ROOT_DIR}/database/include)
set(LIBRARY_INCLUDE_DIR ${LIBRARY_INCLUDE_DIR} CACHE FILEPATH "" FORCE)
然而,这通常不赞成,因为当最终用户调整cmake-gui程序中的值时,您的代码将使用FORCE-d值覆盖用户选择。所以...我建议你只使用你一直在使用的那条线:抵抗FORCE。
要确保它确实生效,只需在CMakeLists.txt的末尾添加此代码:
message(STATUS "LIBRARY_INCLUDE_DIR='${LIBRARY_INCLUDE_DIR}'")
所以......鉴于你的代码是正确的,必然会有其他事情导致你认为某些事情是错的。我很想知道那可能是什么......也许是你的下一个Stack Overflow问题。