静态链接ImageMagick?

时间:2015-11-15 12:00:02

标签: cmake

目前我对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应该以某种方式静态链接,有没有办法这样做?

1 个答案:

答案 0 :(得分:1)

您可以为可执行文件指定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变量的影响。

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

可以找到有关CMake和RPATH交互的更详细说明{。{3}}。

请注意,在RPATH中使用包本地库的绝对路径会使包可分发,但不可重定位:在其他计算机上需要包(包含其libs) )在同一位置,它已安装在原始机器上。

对于make package 可重定位,即允许它(使用libs)在其他机器上有任何路径,RPATH for executable应使用相对于$ORIGIN的路径 - 带可执行文件的目录本身。但是在CMAKE_INSTALL_RPATH变量中使用此基础会比较棘手,请阅读here以获取更多信息。