Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Rcpp中的编译器和链接器标志:Magick++;_C++_R_Imagemagick_Rcpp_Magick++ - Fatal编程技术网

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

C++ Rcpp中的编译器和链接器标志:Magick++;,c++,r,imagemagick,rcpp,magick++,C++,R,Imagemagick,Rcpp,Magick++,我有一个R脚本,它加载一个Rcpp文件。Rcpp文件需要magick++库,因此我使用: #include <Rcpp.h> #include <Magick++.h> 已安装库libmagick++-dev 如何将Magick++包含在Rcpp文件中?如何用标志编译它?例如: -DHAVE_CONFIG_H, -DMAGICKCORE_QUANTUM_DEPTH=16, -DMAGICKCORE_HDRI_ENABLE=0 一个简单的工作示例: mwe.r libr

我有一个R脚本,它加载一个Rcpp文件。Rcpp文件需要magick++库,因此我使用:

#include <Rcpp.h>
#include <Magick++.h>
已安装库libmagick++-dev

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

-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)]]
#包括
#包括
//[[Rcpp::插件(cpp11)]]

正如@hrbrmstr提到的,有一个CRAN包已经提供了ImageMagick功能;也许这样可以避免自己做任何事情

从这些中可以看到C++程序需要知道编译器标志(输出的代码> MaGik++-CONFIG-CPPFLAGS——CXXFLAGG/<代码>)和链接标志(<代码> MaGICK++-CONFIG-LDFLAGS——LIBS)。 用复杂的编译和链接步骤编译Rcpp代码的最佳方法是(我在这里不是专家…)创建一个Rcpp包

/tmp$ Rdev --vanilla -e "Rcpp::Rcpp.package.skeleton('Magick')"
/tmp$ cd Magick
我将Magick/src/rcpp\u hello\u world.cpp编辑为

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

using namespace Rcpp;

// [[Rcpp::export]]
LogicalVector rcpp_hello_world()
{
    Magick::InitializeMagick("RcppMagick");
    return true;
}
然后我更新了我的包的属性,安装了它,并验证它是否可以使用

/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中时可能会遇到许多问题。

正如@hrbrmstr提到的,有一个CRAN包已经提供了ImageMagick功能;也许这样可以避免自己做任何事情

从这些中可以看到C++程序需要知道编译器标志(输出的代码> MaGik++-CONFIG-CPPFLAGS——CXXFLAGG/<代码>)和链接标志(<代码> MaGICK++-CONFIG-LDFLAGS——LIBS)。 用复杂的编译和链接步骤编译Rcpp代码的最佳方法是(我在这里不是专家…)创建一个Rcpp包

/tmp$ Rdev --vanilla -e "Rcpp::Rcpp.package.skeleton('Magick')"
/tmp$ cd Magick
我将Magick/src/rcpp\u hello\u world.cpp编辑为

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

using namespace Rcpp;

// [[Rcpp::export]]
LogicalVector rcpp_hello_world()
{
    Magick::InitializeMagick("RcppMagick");
    return true;
}
然后我更新了我的包的属性,安装了它,并验证它是否可以使用

/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中时可能会遇到许多问题。

您了解如何将其集成到R中吗?您可能只需要设置包含和链接路径,但还没有提供MWE。@hrbrmstr MWE included您需要学习如何编写一个包(而不是
source()
ing一个文件),该包在本例中具有外部依赖项Magick++库。还要注意的是,仅仅包含一个头文件(正如您所做的那样)通常是不够的。。。除非库实际上只是标题。有些是,我们使用它们,因为作为标题只会让这变得容易。正常情况下是链接,而且更难。但是有很多现有的示例和一些文档可用。您是通过委托从二进制文件安装了所有Imagemagick,还是仅安装了magick++源代码?您看过如何将其合并吗?您可能只需要设置包含和链接路径,但还没有提供MWE。@hrbrmstr MWE included您需要学习如何编写一个包(而不是
source()
ing一个文件),该包在本例中具有外部依赖项Magick++库。还要注意的是,仅仅包含一个头文件(正如您所做的那样)通常是不够的。。。除非库实际上只是标题。有些是,我们使用它们,因为作为标题只会让这变得容易。正常情况下是链接,而且更难。但是有很多现有的示例和一些文档可用。您是通过委托从二进制文件安装了所有Imagemagick,还是仅安装了magick++源代码?回答得不错。一旦你做到这一步,并且足够小心,就可以很容易地用Rcpp属性术语创建一个“插件”,这样就可以通过引用包中的插件并从中获取标志来使用这些标志。RcppGSL是一个例子,RcppMLPACK也是一个例子。回答不错。一旦你做到这一步,并且足够小心,就可以很容易地用Rcpp属性术语创建一个“插件”,这样就可以通过引用包中的插件并从中获取标志来使用这些标志。RcppGSL和RcppMLPACK就是一个例子。