在cmake构建中使用外部DLL

sid*_*guy 7 dll cmake freeimage

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

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

FreeImage.lib
FreeImage.dll
Run Code Online (Sandbox Code Playgroud)

现在我的问题是双重的:

  1. 我想从我的cmake脚本执行"make".
  2. 我想链接到导入lib(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)
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我在Windows 7上运行.我打算用MSVC和MinGW构建我的项目.

谢谢!

编辑:我现在正在尝试使用ExternalProject_Add,如下所示:

ExternalProject_Add(
    FreeImage
    PREFIX ./Libs/FreeImage
    URL ./Libs/FreeImage
    BUILD_COMMAND make
)
Run Code Online (Sandbox Code Playgroud)

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

And*_*dré 2

在我看来,有两种选择:

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

execute_process( COMMAND make WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/3rdParty/FreeImage )
Run Code Online (Sandbox Code Playgroud)

或者,您可以将 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模块。您还可以查看Kitware 的这篇文章,了解此模块的概述。本质上,您指定获取源代码、配置构建、构建源代码并安装它所需的完整命令链。全部在您自己的 CMakeLists.txt 中