首页 > 解决方案 > 为共享库导入编写独立、可重用的 CMake 文件的正确方法是什么?

问题描述

初始情况

假设我有一个名为kitten的项目。对于这个项目,我需要链接一个外部的共享库meow,它没有或没有或糟糕/古老的 CMake 支持。出于某种原因,我决定不简单地为链接和复制这个项目所需的文件制定调整规则,而是想创建一个独立的 CMake 文件以供重用、共享或仅仅因为我喜欢保持整洁。

目标

基本上是这样的:

include(cmake/meow.cmake)
add_executable(kitten kitten.cpp)
target_link_libraries(kitten meow)

然后我希望能够构建小猫并从构建目录运行它。我的 IDE VS Code 会从构建目录自动运行它,所以我认为它通常会以这种方式工作。

挑战

  1. meow的包含目录添加到包含路径。✔</li>
  2. 链接meow ( meow.lib/ meow.a)的静态部分。✔</li>
  3. 使用正确的库配置(DEBUGRELEASE)。✔</li>
  4. 确保在 build 目录中执行kitten时找到meow ( meow.dll/ )的共享部分。❌</li> meow.so

解决方法

挑战1到3没问题。在我的meow.cmake我刚刚放:

add_library(meow SHARED IMPORTED)
target_include_directories(meow INTERFACE "${MEOW_DIR}/include")

set_target_properties(meow PROPERTIES
    # set location of DLL/SO files depending on the configuration
    IMPORTED_LOCATION "${MEOW_DIR}/bin/Release/meow${CMAKE_SHARED_MODULE_SUFFIX}"
    IMPORTED_LOCATION_DEBUG "${MEOW_DIR}/bin/Debug/meow_d${CMAKE_SHARED_MODULE_SUFFIX}"

    # set location of LIB/A files depending on the configuration
    IMPORTED_IMPLIB "${MEOW_DIR}/lib/Release/meow${CMAKE_IMPORT_LIBRARY_SUFFIX}"
    IMPORTED_IMPLIB_DEBUG "${MEOW_DIR}/lib/Debug/meow_d${CMAKE_IMPORT_LIBRARY_SUFFIX}"

    IMPORTED_CONFIGURATIONS "RELEASE;DEBUG"
)

挑战 4,然而,我正在努力。我什至不知道 CMake 是否支持在构建目录中执行可执行文件的想法,或者是否正确的方法是首先安装目标。或者也许这个用例是如此不常见或无关紧要,以至于没有人费心让它可以处理?或者,也许我只是还没有弄清楚,如何做到这一点?

我想出了以下混乱的想法,它只需要修复一个细节即可按预期工作,但总而言之,我发现整个过程对于链接和复制两三个文件来说有点乏味,这就是为什么我我在这里询问正确的方法,如果有的话。

add_custom_target(meow-copy
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        "$<TARGET_FILE:meow>" # this automatically points to the right DLL/SO
        "${CMAKE_CURRENT_BINARY_DIR}" # PROBLEM: this points to the build root
)

add_library(meow-autocopy INTERFACE)
target_link_libraries(meow-autocopy INTERFACE meow)
add_dependencies(meow-autocopy meow-copy)

(在这种情况下,我需要target_link_libraries(kitten meow-autocopy)进行自动复制。)

这里的问题是它CMAKE_CURRENT_BINARY_DIR确实指向构建根目录(例如) ,如果目标被分类到子目录中(它们通常在我的项目中)./build,可执行文件将存储在./build/Debug或分别甚至在子目录中。./build/Release

标签: cmakeshared-libraries

解决方案


推荐阅读