Cmake库前缀/后缀

时间:2015-09-27 08:50:07

标签: 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上)来解决此问题。但是......这真的是最好的方式吗?我不可能成为第一个遇到这种情况的人。

1 个答案:

答案 0 :(得分:1)

通常你让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路径添加到PATHSfind_path的{​​{1}}参数中(这些是CMake知道在哪里的指针看)。