如何在多平台 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}")
我正在寻找一种在 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}")