在我的 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更改的值?
一个解决方案,我可以跟在一些测试手动的变量设置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"
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1528 次 |
| 最近记录: |