Rcpp:Magick++中的编译器和链接器标志
Compiler and linker flags in Rcpp: Magick++
我有一个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.中时可能会遇到许多问题
相关文章:
- 在 CMake 中为每个目标设置编译器/链接器标志
- CMake 3.5 中的链接器标志位置
- C++ CMake 中的链接器标志
- 链接库作为 CMAKE 中工具链文件中标志的一部分
- 链接QT5库会自动将额外的FPIC标志传递给NVCC编译器,并通过cmake Cause错误
- 链接标志对静态库意味着什么
- Rcpp:Magick++中的编译器和链接器标志
- 如何从框架中知道链接标志
- 如何通过Gradle将链接标志传递到Android Studio中的CMAKE
- 标志以将IPDB和IOBJ文件从链接时间代码生成优化(LTCG)移动
- 为什么我需要将 -lstdc++ 添加到我的其他链接器标志中
- 链接器命令失败,退出代码为 1,在 g++ 中带有 -o3 标志
- cmake从子目录中添加了破坏链接/库链接优先级的标志和库
- 如何让OCaml链接器标志与C++cmake构建链接
- 重新排序GNU Autotools链接器标志
- xcode:添加链接器标志和"link binary with libraries"的区别
- 设备陀螺仪(加速度计)在 Cocos2dx-2.2.6 中无法使用 -ObjC 链接器标志
- CMake:拥有不同链接标志的正确方式
- 使用QTCreator.pro文件中的QMAKE链接标志顺序
- 使用自定义链接标志构建poco库