从使用其他共享库的源文件构建和使用共享库。 (RInside)

时间:2018-02-16 13:17:48

标签: c++ rinside

我是初学者,正在构建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)我在这里做错了什么。
我在谷歌驱动器中包含了一些文件。

drive

我尝试在线搜索但无法理解。我绝对不会理解某些事情。谁能请帮忙。

1 个答案:

答案 0 :(得分:2)

当您从test1.h加入test2.h时,您还会加入Rinside.h,因为test1.h包含Rinside.h

不要test1.h中加入test1.cc,但要将其包含在test1.cc中,这样您就可以构建系统,使其成为唯一的来源依赖于Rinside库的文件是test1。使用test1.h功能的任何其他来源只会使用state内的任何内容,从而有效地创建抽象RInside所需的图层。