目前我对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应该以某种方式静态链接,有没有办法这样做?
答案 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以获取更多信息。