强制 find_library 再次搜索

Spi*_*ros 3 cmake

在我的 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"
)
Run Code Online (Sandbox Code Playgroud)

如果用户更改了CUDA_BACKENDcmake的值并运行,find_library则不会再次运行,因为该变量MYLIBRARY_LIBRARY包含有效路径(遵循文档):

一旦其中一个调用成功,结果变量将被设置并存储在缓存中,这样调用就不会再次搜索。

所以,我的问题是:强制find_library再次搜索库的最干净的方法是CUDA_BACKEND更改的值?

Spi*_*ros 5

一个解决方案,我可以跟在一些测试手动的变量设置MYLIBRARY_LIBRARYMYLIBRARY_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"
)
Run Code Online (Sandbox Code Playgroud)