cmake - 您如何在 CMake 中解析优化/调试库字符串?

标签 cmake

某些 CMake 内置模块,例如 FindPythonLibs ,设置一些将包含库列表的变量,以便您拥有一组用于调试和发布构建的库。当您打印其中一个时,它看起来像 optimized;C:\foo\python27.lib;debug;C:\foo\python27_d.lib
现在,至少在 Windows 上,只有一个版本的 python 可以链接 - 与您的构建配置匹配的版本。如果您正在构建调试,则必须链接到调试 python,对于发布也是如此。因此,当只有一个值相关时,处理这些多个值对我来说毫无意义。所以我有两个问题:

  • 如果我只是将这个字符串按原样传递给 target_link_libraries(),它是否总是会根据我的 CMAKE_BUILD_TYPE 选择正确的字符串? ?
  • 即使它只是弄清楚了,我仍然需要提取它要选择的路径,因为我需要该路径用于另一个目的。因此,例如,如果 CMAKE_BUILD_TYPE=Debug ,我需要字符串 C:\foo\python27_d.lib所以我可以在我的脚本中用它做其他事情。

  • 通常如何解决这个问题?

    最佳答案

    如果您查看 syntax对于 target_link_libraries你会看到你传递了额外的参数来指示库的优化或调试版本。

    需要注意的是 CMake 的语法使得做 foo(A;B;C)相当于 foo(A B C) .

    所以你根本不需要解析字符串; CMake 的有趣语法为您处理它:CMake 扩展变量值,然后将其扩展为单独的参数到 target_link_libraries :

    target_link_libraries(mytarget ${PythonLibs_LIBRARIES})
    

    扩展到
    target_link_libraries(mytarget optimized;C:\foo\python27.lib;debug;C:\foo\python27_d.lib)
    

    扩展到
    target_link_libraries(mytarget optimized C:\foo\python27.lib debug C:\foo\python27_d.lib)
    
  • 是的。
  • 我不确定是否有任何直接的方法可以询问特定库的哪个版本被链接到。也许有关您正在尝试做什么的一些细节会提出解决方案。无论如何,也许使用generator expressions可以做你需要的,或者也许this answer有帮助。


  • 我认为要复制文件,您可以使用以下内容:
    add_custom_command(TARGET mytarget POST_BUILD
      COMMAND ${CMAKE_COMMAND} -E copy C:\foo\python27_d.dll $<TARGET_FILE_DIR:mytarget>)
    

    我仍然不确定如何获取目标所依赖的库的路径。

    关于cmake - 您如何在 CMake 中解析优化/调试库字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687909/

    相关文章:

    c++ - CMake 与多个 gtest 冲突

    c++ - 使用Cmake输出库信息

    c++ - CMake:带有单元测试的项目结构

    android-studio - 如何在Android Studio中使用CMake -C选项(等级)?

    c - 在 cmake 中将静态库链接到 exe(在 Linux 上)

    c++ - Mac OS 上 CLion 中的新 Vulkan 项目不会创建 VkInstance

    c++ - 让openmp g++-6.2.0 没有那个文件

    c++ - 如何在Visual Studio的CMakeLists.txt文件中设置CLion构建体系结构?

    c++ - 如何安装与接口(interface)库私下链接的目标

    c++ - Boost.Tests 入口点在哪里?