强制CMAKE使用给定的库而不使用其他任何内容

时间:2014-08-01 13:17:36

标签: cmake

问题的位置

我试图强迫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变量设置为找不到

问题

  1. 为什么cmake找不到这些库?
  2. 以上文件是否正确?

1 个答案:

答案 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,而是编写一个脚本来将值加载到缓存中。

相关问题