Cmake 库前缀/后缀

标签 cmake

我需要链接到第三方预建共享库。在 Windows 上,这意味着与 Third_party.lib 链接,在 Linux/Android 上,这意味着与 libThird_party.so 链接。所以为了跨平台,我试着把它写成:

${CMAKE_IMPORT_LIBRARY_PREFIX}Third_party${CMAKE_IMPORT_LIBRARY_SUFFIX}

这在 Windows 上运行良好,但在 Linux/Android 上,这些变量是空白的。我知道 Linux/Android 没有导入库,但是这些变量为空实际上是一个很大的麻烦。将变量更改为 CMAKE_SHARED_LIBRARY_... 也不起作用,因为即使 Linux/Android 会像我想要的那样查找 lib/.so,Windows 也会查找 .dll,而我没有'想要。

看来我可以通过使用共享库变量中的值填充导入库变量(仅在 Linux 上)来解决这个问题。但是……这真的是最好的办法吗?我不可能是第一个碰到这个的人。

最佳答案

通常,您会让 CMake 及其助手完成找出正确名称的工作。很可能,对于您的第三方库,已经有一个 Find<Library>.cmake脚本在那里。

如果没有:这是取自 FindUSB.cmake 的内容来自 GNU Radio

if(NOT LIBUSB_FOUND)
  pkg_check_modules (LIBUSB_PKG libusb-1.0)
  find_path(LIBUSB_INCLUDE_DIR NAMES libusb.h
    PATHS
    ${LIBUSB_PKG_INCLUDE_DIRS}
    /usr/include/libusb-1.0
    /usr/include
    /usr/local/include
  )

  find_library(LIBUSB_LIBRARIES NAMES usb-1.0 usb
    PATHS
    ${LIBUSB_PKG_LIBRARY_DIRS}
    /usr/lib
    /usr/local/lib
  )

if(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
  set(LIBUSB_FOUND TRUE CACHE INTERNAL "libusb-1.0 found")
  message(STATUS "Found libusb-1.0: ${LIBUSB_INCLUDE_DIR}, ${LIBUSB_LIBRARIES}")
else(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)
  set(LIBUSB_FOUND FALSE CACHE INTERNAL "libusb-1.0 found")
  message(STATUS "libusb-1.0 not found.")
endif(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES)

mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES)

endif(NOT LIBUSB_FOUND)

注意 pkg_check_modules 指令和 find_library 指令负责为您提供正确的东西,而无需您手动添加后缀等。

您可能希望将您期望的 .dll 路径添加到 PATHS find_path 的参数和 find_library (这些是 CMake 知道在哪里看的指针)。

关于Cmake 库前缀/后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32806160/

相关文章:

linux - 如何在项目中使用 CMake 包含 bluez 最新版本库

visual-studio - 在 Windows 上的 C++ 应用程序中使用 PyTorch 模型

c++ - 使用 CMake 构建可移植的 Python C-API

c++ - 使用 CMake 安装时永久存储环境变量

cmake - 为什么 CMake 检查 C++ 编译器?

linux - CMake 设置环境变量

assembly - 如何使用 Cmake 用 NASM 构建二进制文件

cmake - CMake没有获取链接库的INTERFACE_INCLUDE_DIRECTORIES

cmake - qtcreator cmake "No executable specified"

C++ Cmake boost lib不断抛出很多错误