簡體   English   中英

從使用另一個共享庫的源文件中構建和使用共享庫。 (RInside)

[英]Building and using a shared library from source files that use another shared library. (RInside)

我是開始構建c ++應用程序和RInside(一個從C ++程序提供嵌入式R解釋器訪問的庫)的新手,並且需要一些幫助。 我想將使用RInside的所有代碼保留在類/模塊中,並僅向需要這些數據的其他程序提供一個函數(接受一些輸入,使用RInside完成一些任務,然后返回輸出)。 我正在嘗試是否可以在具有許多其他源文件和單獨的makefile的另一個項目/模塊(如果有人要的話,請使用Omnet ++)中使用此功能。 如果可能的話,我不想碰那個模塊及其編譯過程。 因此,我嘗試了一個簡單的示例,並對構建產生了疑問。 我在Test1類中有RInside代碼,想在Test2類中使用它。 據我了解,我正在使用RInside作為共享庫。 所以我需要使用Test1構建一個共享庫,並在Test2中包含或引用它。

目錄Shared_1:Test1.h,Test1.cc:類Test1

目錄shared_2:Test2.h,Test2.cc:類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和libTest1.so的包含目錄進行編譯時,它給了我錯誤。 如果我理解正確,則在構建Test2時,g ++會嘗試編譯Test1。 因此它說即使我沒有直接在Test2中包括它也找不到RInside.h。

 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)我在這里做錯了。
我已經在Google驅動器中添加了一些文件。

駕駛

我嘗試在線搜索,但聽不懂。 我絕對想了解一些東西。 誰能幫忙。

當您從test2.h包含test1.h時,您還包括Rinside.h因為test1.h包含了它。

不要test1.h包括Rinside.h ,而在test1.cc包括它, test1.cc ,您將以這樣的方式構造系統,使得依賴Rinside庫的唯一源文件是test1.cc 使用test1功能的任何其他源都將僅使用test1.h內部的內容,從而有效地創建抽象RInside所需的層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM