CMake静态链接ImageMagick



目前我对C++和CMake真的很陌生,但我有一个程序想要静态链接ImageMagick,但只有ImageMagick。

主要是因为我需要ImageMagick,这不是所有地方都支持的。我也可以克隆源代码。目前我的CMakeList.txt是这样的:

cmake_minimum_required(VERSION 3.3)
project(envisia_worker)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
# ImageMagick
find_package(ImageMagick COMPONENTS Magick++)
# Nuance
link_directories("/usr/local/lib/nuance-omnipage-csdk-lib64-19.2")
# Building
set(SOURCE_FILES main.cpp)
add_executable(envisia_worker ${SOURCE_FILES})
# Nuance
include_directories("/usr/local/include/nuance-omnipage-csdk-19.2")
target_link_libraries(envisia_worker kernelapi recpdf recapiplus)
# ImageMagick
include_directories(${ImageMagick_INCLUDE_DIRS})
target_link_libraries(envisia_worker ${ImageMagick_LIBRARIES})

然而,这将链接到我的发行版ImageMagick 5。我还包括了其他库,它们应该保持dynlib,然而ImageMagick应该以某种方式静态链接,有什么方法可以做到吗?

您可以为可执行文件指定RPATH,因此当加载可执行文件时,它将在系统目录之前搜索:

...
# ImageMagick
find_package(ImageMagick COMPONENTS Magick++)
# Deduce directories, where ImageMagick libraries are located
set(ImageMagick_LIBRARIES_DIRS)
foreach(lib ${ImageMagick_LIBRARIES})
    get_filename_component(dir ${lib} DIRECTORY)
    list(APPEND ImageMagick_LIBRARIES_DIRS ${dir})
    list(REMOVE_DUPLICATES ImageMagick_LIBRARIES_DIRS)
endforeach()
# Tell CMake to set RPATH for all *futher* targets.
set(CMAKE_INSTALL_RPATH ${ImageMagick_LIBRARIES_DIRS})
... # Create targets, link them, etc.
# Install targets
install(TARGETS envisia_worker DESTINATION <...>)

请注意,只有安装的目标才会受到CMAKE_INSTALL_RPATH变量的影响。

Built目标已将RPATH指向目标链接到的每个库,但此类目标通常仅在当前计算机上使用。它是安装的目标,需要可分配到其他机器。

关于交互CMake和RPATH的更详细的描述可以在这里找到。


请注意,在RPATH中使用包本地库的绝对路径会使包可分发,但不可重新定位:在其他计算机上,您需要将包(及其库)安装在原始计算机上的相同位置

对于使包可重定位,也就是说,允许它(带有库)在其他机器上有任何路径,可执行文件的RPATH应该使用路径,相对于具有可执行文件本身的$ORIGIN目录。但是在CMAKE_INSTALL_RPATH变量中使用这个基础更为棘手,请阅读此邮件了解更多信息。

最新更新