如何在 CMake 项目中使用外部 DLL

Posted

技术标签:

【中文标题】如何在 CMake 项目中使用外部 DLL【英文标题】:How to use external DLLs in CMake project 【发布时间】:2013-06-20 22:50:14 【问题描述】:

我一直在互联网上搜索,但找不到任何可以回答我的问题的内容(或者我不知道要搜索什么)。

无论如何,这是我的问题: 我想在我的 CMake 项目中使用 3rdParty 库(.dll 文件)。我想要包含的库 (https://github.com/pitzer/SiftGPU) 是开源的,并且还提供了我想使用的二进制文件,并且如果相关,还可以使用 CMake 作为构建工具。

我希望我已经足够清楚了。

【问题讨论】:

【参考方案1】:

首先,编辑您的 CMakeLists.txt 以包含您的第三方库。您需要两件事:头文件的路径和要链接的库文件。例如:

# searching for include directory
find_path(SIFTGPU_INCLUDE_DIR siftgpu.h)

# searching for library file
find_library(SIFTGPU_LIBRARY siftgpu)

if (SIFTGPU_INCLUDE_DIR AND SIFTGPU_LIBRARY)
    # you may need that if further action in your CMakeLists.txt depends
    # on detecting your library
    set(SIFTGPU_FOUND TRUE)

    # you may need that if you want to conditionally compile some parts
    # of your code depending on library availability
    add_definitions(-DHAVE_LIBSIFTGPU=1)

    # those two, you really need
    include_directories($SIFTGPU_INCLUDE_DIR)
    set(YOUR_LIBRARIES $YOUR_LIBRARIES $SIFTGPU_LIBRARY)
endif ()

接下来,您可以对其他库执行相同的操作,当检测到每个库时,链接到目标:

target_link_libraries(yourtarget $YOUR_LIBRARIES)

然后你可以用 CMake 配置你的项目,但是由于它没有任何神奇的方法来找到你安装的库,它不会找到任何东西,但它会创建两个缓存变量:SIFTGPU_INCLUDE_DIR 和 @987654324 @。

使用 CMake GUI 让SIFTGPU_INCLUDE_DIR 指向包含头文件的目录,并让SIFTGPU_LIBRARY 指向第三方库的.lib 文件。

对每个第三方库重复,再次配置并编译。

【讨论】:

这如何告诉 cmake .dll 文件所在的位置?我只看到静态链接到一个库并提供头文件所在位置的提示。 Cmake 不需要知道 dll 文件在哪里。这些文件仅在运行二进制文件时才需要,而不是在编译时。 Mingw 可以直接使用 dll 进行链接。

以上是关于如何在 CMake 项目中使用外部 DLL的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CMake 项目中包含外部库

如何使用 CMake 构建和使用外部库

如何包含具有多个 dll/dylib 的外部(共享)库

CMake - 如何链接到我的项目打包的外部库?

CMake:如何构建外部项目并包含其目标

当您的外部 SDK 只有 .dll、.lib、.h 文件时如何链接和构建项目