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

时间:2017-01-10 16:28:05

标签: dll cmake shared-libraries cross-platform

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

在cmake中定义“libB / CMakeLists.txt”

find_library (libB A)

我将libB与libA相关联。在cygwin下链接时,此行失败。当我将其更改为

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

它有效。

两个lib都构建为共享库。

“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下,这很好用。 libs放在“/ user / local / lib”中。在Windows下,libs被放入“/ user / local / lib / shared”+ dll被放入“/ user / local / bin”。

将libB与libA链接的语句更改为(“libB / CMakeLists.txt”):

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

任何想法如何在简单 - 可能 - 平台独立的行中处理这两个构建的链接器引用?

1 个答案:

答案 0 :(得分:1)

这应该在你的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}")