如何在多平台 cmake 构建中搜索库?

How to search for libraries in multiplatform cmake builds?

我正在寻找一种在 cmake 中处理 linked 库的好方法。在我的例子中,cmake 配置文件 (CMakeLists.txt) 在 Linux 环境中执行,在 Windows 上的 cygwin 上执行。 构建过程包含两个库。 libA 是从源代码构建的,只依赖于标准。 CAPI。 libB 也是从源构建的,包括 libA。这些库是单独构建的(有自己的 git repro)。

通过在 cmake 中定义 "libB/CMakeLists.txt"

find_library (libB A)

我link正在对 libA 使用 libB。在 cygwin 下 linking 时,此行失败。当我把它改成

find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a)

有效。

两个库都构建为共享库。

"libA/CMakeLists.txt":

add_library(libA SHARED ${libA_source})
install(
        TARGETS libA 
        RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static
    )

"libB/CMakeLists.txt":

add_library(libB SHARED ${libB_source})
install(
        TARGETS libB 
        RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}
        LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}/static
    )

在 Linux 下这工作正常。库被放入“/user/local/lib”。在 Windows 下,库被放入“/user/local/lib/shared”+ dll 被放入“/user/local/bin”。

link libB 对 libA 的语句更改为 ("libB/CMakeLists.txt"):

if (UNIX)
  find_library (libB A)
elseif (CYGWIN)
  find_library (libB ${CMAKE_LIBRARY_PATH}/static/libA.dll.a)
endif()

知道如何在一个简单的(也许是)独立于平台的行中处理这两个构建的 linker 引用吗?

这应该适用于您的 libB/CMakeLists.txt:

find_library(libA 
             NAMES A libA libA.so libA.dll libA.dll.a
             HINTS ${CMAKE_INSTALL_FULL_LIBDIR}
)
target_link_libraries(libB ${libA})

使用

检查 libA 的路径
message(STATUS "libA=${libA}")