나는 src 폴더 아래에 C 및 C++로 작성된 코드가 들어있는 R 패키지를 가지고 있습니다. 현재 패키지는 기본 디렉토리 구조를 따르므로 Rstudio에서 컴파일되고 작동합니다. 프로젝트가 빌드됨에 따라 서브 폴더 내에서 src 아래에 코드를 구성 할 수 있기를 원합니다. "Writing R extensions"의 지시에 따라 - 하위 디렉토리에서 컴파일하면 'test'(/ src/test)라는 폴더를 만들었고 이제는 내 모든 파일 (* .c, * .cpp, * .h)을 포함하고 있습니다. 그래서 같은 수정 내 Makevars -서브 디렉토리의 src 폴더에있는 C/C++ 파일을 사용하는 패키지의 rstudio에 공유 라이브러리를 빌드하고로드하는 방법은 무엇입니까?
SOURCES_C = $(wildcard test/*.c)
SOURCES_CPP = $(wildcard test/*.cpp)
PKG_CPPFLAGS= -I${R_HOME}/include -I.
PKG_LIBS = -L${R_HOME}/lib
CXX_STD = CXX11
OBJECTS =$(SOURCES_CPP:.cpp=.o) $(SOURCES_C:.c=.o)
all : $(SHLIB)
#PKG_CFLAGS= -Wall
clean : rm -f *.o
내가는 C/C++ 파일 SRC 내부 하위 폴더 아래에이 상태에서 프로그램을 컴파일 할 수 있어야합니다. 앞서 언급 한 Makevars -> 모든 C/CPP 파일에 대해 올바른 플래그와 컴파일러가있는 테스트 폴더에서 별도의 객체 파일을 빌드하고 있습니다. 그러나 공유 오브젝트에 대한 빌드 명령과 약간의 불일치가 있습니다. 이것은 정의되지 않은 기호 오류로 실패한 src/test에서 파일을 컴파일 할 때의 로그입니다.
gcc -std=gnu99 -shared -L/usr/local/lib64 -o BioCro.so test/BBox.o test/Climate.o test/Compound.o test/Grid.o test/LeafOptics.o test/Maths.o test/Normal.o test/Point3D.o test/Ray.o test/Triangle.o test/Vector3D.o test/runFastTracer.o test/Assigncropcent.o test/AuxBioCro.o test/AuxCropGro.o test/AuxMaizeGro.o test/AuxcaneGro.o test/Auxcropcent.o test/AuxwillowGro.o test/BioCro.o test/CalculateBiogeochem.o test/Calculate_Soil_Layer_Temperature.o test/CanA.o test/CanAC_3D.o test/Century.o test/Copy_CropCent_To_DayCent_Structure.o test/Copy_SoilWater_BioCro_To_CropCent.o test/CropGro.o test/CropGro_c.o test/Filling_BioCro_SoilStructure.o test/assignManagement.o test/c3CanA.o test/c3EvapoTrans.o test/c3photo.o test/c4photo.o test/caneGro.o test/createNULLc3tree.o test/cropcent.o test/dailywillow.o test/denitrify.o test/diffusiv.o test/eC4photo.o test/getIdirIdiff.o test/getsoilprop.o test/leachdly.o test/maizeGro.o test/methane.o test/microclimate_for_3Dcanopy.o test/nitrify.o test/nox_pulse.o test/pi_funcs.o test/printcropcentoutput.o test/test_mainC.o test/tgmodel.o test/tracegas.o test/update_3Dcanopy_structure.o test/wfps.o test/willowCent.o test/willowGro.o -L/usr/local/R-3.1.0/lib64/R/lib -L/usr/local/R-3.1.0/lib64/R/lib -lR
installing to /home/vashist1/R/x86_64-unknown-linux-gnu-library/3.1/BioCro/
** R
** data
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** installing vignettes
** testing if installed package can be loaded
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/home/vashist1/R/x86_64-unknown-linux-gnu-library/3.1/BioCro/libs/BioCro.so':
/home/vashist1/R/x86_64-unknown-linux-gnu-library/3.1/BioCro/libs/BioCro.so:
undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE
Error: loading failed
성공적으로 빌드 된 성공적인 로그와 비교하십시오!
g++ -shared -L/usr/local/lib64 -o BioCro.so Assigncropcent.o AuxBioCro.o AuxCropGro.o AuxMaizeGro.o AuxcaneGro.o Auxcropcent.o AuxwillowGro.o BBox.o BioCro.o CalculateBiogeochem.o Calculate_Soil_Layer_Temperature.o CanA.o CanAC_3D.o Century.o Climate.o Compound.o Copy_CropCent_To_DayCent_Structure.o Copy_SoilWater_BioCro_To_CropCent.o CropGro.o CropGro_c.o Filling_BioCro_SoilStructure.o Grid.o LeafOptics.o Maths.o Normal.o Point3D.o Ray.o Triangle.o Vector3D.o assignManagement.o c3CanA.o c3EvapoTrans.o c3photo.o c4photo.o caneGro.o createNULLc3tree.o cropcent.o dailywillow.o denitrify.o diffusiv.o eC4photo.o getIdirIdiff.o getsoilprop.o leachdly.o maizeGro.o methane.o microclimate_for_3Dcanopy.o nitrify.o nox_pulse.o pi_funcs.o printcropcentoutput.o runFastTracer.o test_mainC.o tgmodel.o tracegas.o update_3Dcanopy_structure.o wfps.o willowCent.o willowGro.o -L/usr/local/R-3.1.0/lib64/R/lib -lR
installing to /home/vashist1/R/x86_64-unknown-linux-gnu-library/3.1/BioCro/libs
1) 공유 객체는 기본 조건에서 g ++를 사용하여 컴파일되지만 하위 디렉토리 조건에서는 사용되는 컴파일러가 gcc입니다. Makevars를 통해 그 행동을 바꿀 수 있습니까?
2) 추가 연구를 통해 정의되지 않은 기호 오류가 -L/-l 플래그로 수정 된 연결 오류임을 알 수있었습니다. 그러나 -L 플래그는 두 빌드 명령 모두에 대해 동일합니다. 링크에 실패한 다른 라이브러리가 기본적으로 링크되어 있습니까?