我是初学者,正在构建c ++应用程序和RInside(一个从C ++程序提供嵌入式R解释器访问的库),需要一些帮助。我想保留所有使用RInside的代码在类/模块中分开,并提供一个函数(接受一些输入,使用RInside执行一些任务并返回输出)到需要这些数据的其他程序。我正在试验我是否可以在另一个项目/模块中使用此功能(Omnet ++静脉,如果有人想要具体),其中包含许多其他源文件和单独的makefile。如果可能的话,我不想触及那些模块及其编译过程。所以我尝试了一个简单的例子,对建筑有疑问。 我在Test1类中有RInside代码,并希望在Test2类中使用它。据我所知,我使用RInside作为共享库。所以我需要使用Test1构建一个共享库,并在Test2中包含或引用它。
目录Shared_1:Test1.h,Test1.cc:class Test1
目录shared_2:Test2.h,Test2.cc:class Test2
Test1.h -> Includes “Rinside.h”
Test1.cc -> includes “Test1.h”
-> main(): Create a Test1 object and call test1Function1()
->test1Function1() : Creates an embedded R instance and does some functionality
Test2.h -> Includes “Test1.h”
Test2.cc -> includes “Test2.h”
-> main() : Create a Test2 object and call test2Function1()
-> test2Function1() : Create a Test1 object and call test1Function1()
我已经像这样从Test1.cc创建了libTest1_1.so。
g++ -I/usr/share/R/include -I/home/aelab/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include -I/home/aelab/R/x86_64-pc-linux-gnu-library/3.4/RInside/include -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g -Wall ./shared_1/Test1.cc -Wl,--export-dynamic -fopenmp -Wl,-Bsymbolic-functions -Wl,-z,relro -L/usr/lib/R/lib -lR -lpcre -llzma -lbz2 -lz -lrt -ldl -lm -lblas -llapack -L/home/aelab/R/x86_64-pc-linux-gnu-library/3.4/RInside/lib -lRInside -Wl,-rpath,/home/aelab/R/x86_64-pc-linux-gnu-library/3.4/RInside/lib -fPIC -shared -o ./shared_1/libTest1_1.so
我想在Test2.cc中使用Test1.cc中的test1Function1(),如果可能的话,使用g ++的不同选项编译Test2.cc。当我使用所有库(用于构建Test1.cc和libTest1_1.so的库)编译Test2.cc时,它运行良好。
g++ -I ./shared_1/ -I/usr/share/R/include -I/home/aelab/R/x86_64-pc-linux-gnu-library/3.4/Rcpp/include -I/home/aelab/R/x86_64-pc-linux-gnu-library/3.4/RInside/include -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g -Wall ./shared_2/Test2.cc -Wl,--export-dynamic -fopenmp -Wl,-Bsymbolic-functions -Wl,-z,relro -L/usr/lib/R/lib -lR -lpcre -llzma -lbz2 -lz -lrt -ldl -lm -lblas -llapack -L/home/aelab/R/x86_64-pc-linux-gnu-library/3.4/RInside/lib -lRInside -Wl,-rpath,/home/aelab/R/x86_64-pc-linux-gnu-library/3.4/RInside/lib -L./shared_1/ -lTest1_1 -fPIC -o ./shared_2/Test2.o
但是当我通过提供Test1.h的include dir和libTest1.so来编译它时,它给了我错误。如果我理解正确,g ++正在尝试在构建Test2时编译Test1。因此它说它找不到RInside.h,即使我没有直接在Test2中包含它。
g++ -I ./shared_1/ ./shared_2/Test2.cc -L./shared_1/ -lTest1_1 -fPIC -shared -o ./shared_2/Test2_3.o
在./shared_2/Test2.h:11:0中包含的文件中,
来自./shared_2/Test2.cc:8:
./shared_1/Test1.h:12:74:致命错误:RInside.h:没有这样的文件或目录
#include
^
编译终止。
我想了解的内容:1)如何使用RInside与其他项目/模块分离代码。 2)我在这里做错了什么。
我在谷歌驱动器中包含了一些文件。
我尝试在线搜索但无法理解。我绝对不会理解某些事情。谁能请帮忙。
答案 0 :(得分:2)
当您从test1.h
加入test2.h
时,您还会加入Rinside.h
,因为test1.h
包含Rinside.h
。
不要在test1.h
中加入test1.cc
,但要将其包含在test1.cc
中,这样您就可以构建系统,使其成为唯一的来源依赖于Rinside库的文件是test1
。使用test1.h
功能的任何其他来源只会使用state
内的任何内容,从而有效地创建抽象RInside所需的图层。