我需要链接到第三方预建共享库。在 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/