在我的CMake脚本中,我必须链接一个可以有两个不同名称的库,具体取决于缓存变量。
库可以是libMyLibrary.a或libMyLibraryCUDA.a,具体取决于CUDA_BACKEND
是设置为ON还是OFF。 CUDA_BACKEND
是缓存变量。两个库都在同一目录中,其路径在变量MYLIBRARY_ABSOLUTE_PATH
中存储(在用户输入之后)。
if ( CUDA_BACKEND )
set ( MYLIBRARY_NAME "MyLibraryCUDA" )
else ( CUDA_BACKEND )
set ( MYLIBRARY_NAME "MyLibrary" )
endif ( CUDA_BACKEND )
find_library ( MYLIBRARY_LIBRARY
NAMES "${MYLIBRARY_NAME}"
PATHS "${MYLIBRARY_ABSOLUTE_PATH}/lib"
)
如果用户更改CUDA_BACKEND
的值并运行cmake,则find_library
不会再次运行,因为变量MYLIBRARY_LIBRARY
包含有效路径(在the documentation之后):
一旦其中一个调用成功,结果变量将被设置并存储在缓存中,这样就不会再搜索任何调用。
所以,我的问题是:强制find_library
再次搜索库的最简洁方法是CUDA_BACKEND
更改的价值是什么?
答案 0 :(得分:3)
经过一些测试后我可以提供的一个解决方案是在调用MYLIBRARY_LIBRARY
之前手动将变量MYLIBRARY_LIBRARY-NOTFOUND
设置为find_library
。
如果您希望仅在自上次配置后情况发生变化时才实际执行find_library
(在这种情况下仅在用户更改CUDA_BACKEND
时),您可以记录设置的最后状态并检查他们是否改变了下一个代码没有经过测试,但应该可以工作:
# Where CUDA_BACKEND is set
set (CUDA_BACKEND "OFF" CACHE STRING "Whether to use CUDA")
if ("${CUDA_BACKEND}" STREQ "${CUDA_BACKEND_LAST}")
set (CUDA_BACKEND_CHANGED "OFF")
else ("${CUDA_BACKEND}" STREQ "${CUDA_BACKEND_LAST}")
set (CUDA_BACKEND_CHANGED "ON")
endif ("${CUDA_BACKEND}" STREQ "${CUDA_BACKEND_LAST}")
set (CUDA_BACKEND_LAST "${CUDA_BACKEND}")
# Later on, where you define the name of the library
if ( CUDA_BACKEND )
set ( MYLIBRARY_NAME "MyLibraryCUDA" )
else ( CUDA_BACKEND )
set ( MYLIBRARY_NAME "MyLibrary" )
endif ( CUDA_BACKEND )
if (CUDA_BACKEND_CHANGED)
set (MYLIBRARY_LIBRARY "MYLIBRARY_LIBRARY-NOTFOUND")
endif (CUDA_BACKEND_CHANGED)
find_library ( MYLIBRARY_LIBRARY
NAMES "${MYLIBRARY_NAME}"
PATHS "${MYLIBRARY_ABSOLUTE_PATH}/lib"
)