我试图强迫cmake使用一个特定的库。我希望可执行文件与这个可执行文件静态链接,而不是其他。我希望构建失败,如果它无法链接" libgpg-error.a"和" libgcrypt.a"静态来自" / XXX / static_libs" 。目录
到目前为止,我的CMakeLists.txt看起来像这样:
# Project Setup
project(file_crypt)
set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
# Includes
include_directories(.)
# Link
link_directories( ${gcrypt_lib_dir} ${dl_crypt_lib_dir} )
find_library( gcrypt_libs NAMES libgcrypt.a libgpg-error.a PATHS ${gcrypt_lib_dir} NO_DEFAULT_PATH )
# Executables Declarations
add_executable( my_decrypt
my_decrypt.cpp [...] )
set_target_properties( my_decrypt PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32" )
# Link to libraries
target_link_libraries( my_decrypt ${gcrypt_libs} dl crypt )
我补充说:
gcrypt_lib_dir:FILEPATH=/XXX/static_libs
到我的 CMakeCache.txt 。如果我在" / XXX / static_libs" 上做" ls" ,我可以看到" libgpg-error .A"和" libgcrypt.a"。
然后我运行cmake。 然后将gcrypt_libs变量设置为找不到
答案 0 :(得分:1)
我认为您应该在CMakeLists.txt中设置gcrypt_libs
,而不是在自动生成的文件CMakeCache.txt中设置set( gcrypt_libs /XXX/static_libs )
。我相信如果你使用set命令设置变量,它应该工作。添加如下行:
find_library
在致电/XXX/static_libs
之前,它应该有效。
更新:正如评论中所述,cmake -C <initial-cache>
是与机器相关的位置,不应该硬编码到CMakeLists.txt中。您使用paths.txt
初始化变量的想法应该是完美的 - 唯一的事情是,正如cmake的联机帮助页所指出的那样:&#34;给定的文件应该是包含使用CACHE的SET命令的CMake脚本选项,而不是缓存格式文件。&#34;
所以说你保留一个名为set( gcrypt_libs /XXX/static_libs CACHE FILEPATH "" )
的初始缓存文件,它可能有
cmake -C path/to/paths.txt path/to/source
然后你可以用通常的方式配置cmake:
{{1}}
所以基本上,你仍然没有触及CMakeCache.txt,而是编写一个脚本来将值加载到缓存中。