在我的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
包含有效路径(遵循文档):
一旦调用成功,将设置结果变量并将其存储在缓存中,这样就不会再搜索任何调用。
因此,我的问题是:强制find_library
再次搜索该库的最干净方法是CUDA_BACKEND
变更的价值?
一个解决方案,我可以跟在一些测试手动的变量设置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"
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句