Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake库前缀/后缀_Cmake - Fatal编程技术网

Cmake库前缀/后缀

Cmake库前缀/后缀,cmake,Cmake,我需要与第三方预制共享库链接。在Windows上,这意味着链接到第三方.lib,在Linux/Android上,这意味着链接到第三方.so。所以为了跨平台,我试着这样写: ${CMAKE_IMPORT_LIBRARY_PREFIX}Third_party${CMAKE_IMPORT_LIBRARY_SUFFIX} 这在Windows上运行良好,但在Linux/Android上,这些变量为空。我知道Linux/Android没有导入库,但是这些变量为空实际上是一个很大的麻烦。将变量更改为CMAK

我需要与第三方预制共享库链接。在Windows上,这意味着链接到
第三方.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)