Rcpp:Magick++中的编译器和链接器标志

Compiler and linker flags in Rcpp: Magick++

本文关键字:链接 标志 编译器 Magick++ Rcpp      更新时间:2023-10-16

我有一个R脚本,它加载一个Rcpp文件。Rcpp文件需要magik++库,所以我使用了:

#include <Rcpp.h>
#include <Magick++.h>

然而,当我运行脚本时,我得到:

fatal error: Magick++.h: No such file or directory

安装了库libmagick++-dev

如何在Rcpp文件中包含Magick++?如何使用标志编译它?例如:

-DHAVE_CONFIG_H, -DMAGICKCORE_QUANTUM_DEPTH=16, -DMAGICKCORE_HDRI_ENABLE=0

一个最小的工作示例:

mwe.r

library(Rcpp)
sourceCpp("./mwe.cpp")

mwe.cpp

#include <Rcpp.h>
#include <Magick++.h>
//[[Rcpp::plugins(cpp11)]]

正如@hrbrmstr所提到的,有一个CRAN包magik已经提供了ImageMagick功能;也许这样就不用自己做任何事情了?

从这些ImageMagick指令中,您可以看到C++程序需要了解编译器标志(Magick++-config --cppflags --cxxflags的输出)和链接器标志(Magick++-config --ldflags --libs)。

用复杂的编译和链接步骤编译Rcpp代码的最佳方法是(我不是这里的专家…)创建一个Rcpp包

/tmp$ Rdev --vanilla -e "Rcpp::Rcpp.package.skeleton('Magick')"
/tmp$ cd Magick

我将Magick/src/rcpp_hello_world.cpp编辑为

#include <Rcpp.h>
#include <Magick++.h>
using namespace Rcpp;
// [[Rcpp::export]]
LogicalVector rcpp_hello_world()
{
Magick::InitializeMagick("RcppMagick");
return true;
}

并向类似的新文件Magick/src/Makevars添加了包预处理、编译和链接命令(遵循Writing R Extensions,可通过RShowDoc("R-exts")获得)

PKG_CPPFLAGS = `Magick++-config --cppflags`
PKG_CXXFLAGS = `Magick++-config --cxxflags`
PKG_LIBS = `Magick++-config --ldflags --libs`

然后我更新了我的包的属性,安装了它,并验证了它可以使用

/tmp/Magick master$ Rdev --vanilla -e "Rcpp::compileAttributes()"
> Rcpp::compileAttributes()
>
>
/tmp/Magick master$ Rdev --vanilla CMD INSTALL .
* installing to library ...‘/home/mtmorgan/R/x86_64-pc-linux-gnu-library/3.5-Bioc-3.7’
* installing *source* package ‘Magick’ ...
** libs
g++  -I"/home/mtmorgan/bin/R-devel/include" -DNDEBUG `Magick++-config --cppflags` -I"/home/mtmorgan/R/x86_64-pc-linux-gnu-library/3.5-Bioc-3.7/Rcpp/include" -I/usr/local/include  `Magick++-config --cxxflags` -fpic  -g -O3 -Wall -pedantic -c RcppExports.cpp -o RcppExports.o
g++  -I"/home/mtmorgan/bin/R-devel/include" -DNDEBUG `Magick++-config --cppflags` -I"/home/mtmorgan/R/x86_64-pc-linux-gnu-library/3.5-Bioc-3.7/Rcpp/include" -I/usr/local/include  `Magick++-config --cxxflags` -fpic  -g -O3 -Wall -pedantic -c rcpp_hello_world.cpp -o rcpp_hello_world.o
g++ -shared -L/usr/local/lib -o Magick.so RcppExports.o rcpp_hello_world.o -L/usr/lib -L/usr/lib/X11 -lGraphicsMagick++ -lGraphicsMagick -ljbig -lwebp -llcms2 -ltiff -lfreetype -ljasper -ljpeg -lpng12 -lwmflite -lXext -lSM -lICE -lX11 -llzma -lbz2 -lxml2 -lz -lm -lgomp -lpthread
installing to /home/mtmorgan/R/x86_64-pc-linux-gnu-library/3.5-Bioc-3.7/Magick/libs
...
/tmp/Magick master$ Rdev --vanilla -e "Magick::rcpp_hello_world()"
> Magick::rcpp_hello_world()
[1] TRUE

我必须弄清楚要安装什么系统包才能获得Magick++-config。当我第一次尝试安装我的软件包时,R抱怨它不知道-lwebp,所以我也安装了该系统依赖项(libwebp-dev)。该包对于个人使用来说足够好,但对于跨平台或生产使用来说需要更强大。在尝试将这个复杂的库集成到R.中时可能会遇到许多问题