gpt4 book ai didi

Cmake 库前缀/后缀

转载 作者:行者123 更新时间:2023-12-05 06:43:34 34 4
gpt4 key购买 nike

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

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com