我需要链接到第三方预构建的共享库。在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知道去哪里找)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句