dll - 在 cmake 构建中使用外部 DLL

标签 dll cmake freeimage

我正在为我的项目编写 cmake 脚本,但遇到了一个问题:

我的项目使用第 3 方库 (FreeImage),它有自己的基于 Makefile 的构建系统。我可以通过简单地运行“make”(我正在使用 gnuwin32)来构建 FreeImage,这将使用 MinGW 构建 FreeImage 并产生:

FreeImage.lib
FreeImage.dll

现在我的问题是双重的:
  • 我想从我的 cmake 脚本中执行“make”。
  • 我想链接到导入库(FreeImage.lib),并确保将 DLL 复制到正确的位置,以便 EXE 运行。

  • 我知道如何链接到 LIB 文件,但我迷失了其余部分。

    文件夹结构是这样的:
    MyProject                     # main directory
    MyProject/Libs/FreeImage      # FreeImage root directory
    MyProject/Libs/FreeImage/Dist # This is where FreeImage outputs go (LIB and DLL)
    

    顺便说一句:我在 Windows 7 上运行。我计划使用 MSVC 和 MinGW 构建我的项目。

    谢谢!

    编辑:
    我现在正在尝试像这样使用 ExternalProject_Add:
    ExternalProject_Add(
        FreeImage
        PREFIX ./Libs/FreeImage
        URL ./Libs/FreeImage
        BUILD_COMMAND make
    )
    

    这让我成为了那里的一部分,但并不完全奏效......它试图为我配置东西并尝试使用nmake......呃

    最佳答案

    在我看来,有两种选择:

    如果您将 FreeImage 源代码放在项目的源代码树中,最简单的选择可能是使用 execute_process()命令。假设 FreeImage 在“3rdparty/FreeImage/”中您项目的源代码树中,您可以执行以下操作,

    execute_process( COMMAND make WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/3rdParty/FreeImage )
    

    或者,您可以将 dll 从 3rdParty/FreeImage/bin 复制到您自己的 bin 目录中。然后你可以编写一个 FreeImageConfig.cmake 来导入库:

    add_library( FreeImage IMPORTED )
    set_target_properties(FreeImage PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/3rdParty/FreeImage/lib)
    ...

    另一种选择是使用 ExternalProject模块。也可以看看this article从 Kitware 获取此模块的概述。本质上,您指定获取源、配置构建、构建源并安装它所需的完整命令链。全部在您自己的 CMakeLists.txt 中

    关于dll - 在 cmake 构建中使用外部 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5696935/

    相关文章:

    c# - 在 FreeImage 中更改图像分辨率

    c# - 如何将 float 组从 C# 复制到 C dll

    c# - 如何通过更改文本创建一个像这样的dll?

    python - 如何使用 ctypes 读取具有自定义结构的 dll 的输出?

    java - 反编译JAVA DLL

    cmake - 在 ROS 中使用 ZeroMQ 与包 zeromq_catkin - 如何包含?

    c# - 使用 FreeImage 是否可以在 ARGB32 或 RGBA32 而不是 BGRA32 中输出 ConvertToRawBits?

    c++ - 将 .asm 文件编译并链接到 C++ 代码

    debugging - 让 gcc 将相对文件名放入调试信息中

    c++ - 为 iOS 5.0 编译/链接 FreeImage