Cmake库前缀/后缀
我需要与第三方预制共享库链接。在Windows上,这意味着链接到Cmake库前缀/后缀,cmake,Cmake,我需要与第三方预制共享库链接。在Windows上,这意味着链接到第三方.lib,在Linux/Android上,这意味着链接到第三方.so。所以为了跨平台,我试着这样写: ${CMAKE_IMPORT_LIBRARY_PREFIX}Third_party${CMAKE_IMPORT_LIBRARY_SUFFIX} 这在Windows上运行良好,但在Linux/Android上,这些变量为空。我知道Linux/Android没有导入库,但是这些变量为空实际上是一个很大的麻烦。将变量更改为CMAK
第三方.lib
,在Linux/Android上,这意味着链接到第三方.so
。所以为了跨平台,我试着这样写:
${CMAKE_IMPORT_LIBRARY_PREFIX}Third_party${CMAKE_IMPORT_LIBRARY_SUFFIX}
这在Windows上运行良好,但在Linux/Android上,这些变量为空。我知道Linux/Android没有导入库,但是这些变量为空实际上是一个很大的麻烦。将变量更改为CMAKE\u SHARED\u LIBRARY…
也不起作用,因为即使Linux/Android随后会查找lib/。就像我想要的那样,Windows也会查找.dll,我不想要它
似乎我可以通过使用共享库变量的值填充导入库变量(仅在Linux上)来解决这个问题。但是这真的是最好的方法吗?我不可能是第一个碰到这个问题的人。通常你会让CMake和它的助手帮你找出正确的名字。很可能,对于您的第三方库,已经有了一个
Find.cmake
脚本
如果没有:下面是取自FindUSB.cmake
的内容
请注意这个指令,这个指令会在不添加后缀的情况下为您提供正确的内容
您可能希望将.dll的路径添加到
find_path
和find_library
的路径
参数中(这些是CMake知道在哪里查找的指针)。谢谢。我有一个后续问题。其中一些库是使用ExternalProject下载和编译的,这意味着它们在构建时才存在。这在运行初始cmake命令时会导致问题,因为它无法与包含NOTFOUND值的变量链接。通常,您会有子目录,其中包含自己的CMakeLists.txt,然后运行包括这些的子目录,然后从那里运行。然而,现实世界通常要复杂得多。询问有关StackOverflow的全新问题,并提供更多详细信息:)
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)