2011-01-04 3 views
1

타사 DLL을 사용하는 C 코드가 포함 된 R 확장명을 작성했습니다. 컴파일은 R 2.11.0을 사용하는 Rtools를 사용하여 Windows에서 수행됩니다. 내 계획은 DLL이 소스 패키지와 함께 배포되고 확장 프로그램의 src 디렉토리에 저장된다는 것입니다. 내 질문에 다음 어떻게 타사 DLL에 연결할 때 컴파일러에서 src 디렉터리를 찾는 발생할 수 있습니다.타사 DLL을 사용하여 R 확장명을 컴파일

현재, 나는 명령을 사용하여 패키지를 건물입니다 :

R CMD build --binary MyPackage 

가 나는 또한 다음 줄에 파일 SRC ​​/ Makevars 있습니다

PKG_LIBS = -ldlxapi32 

이 보장 타사 DLL이 , dlxapi32.dll은 컴파일에 포함됩니다. 그러나 내 패키지의 src 디렉토리가 표준 라이브러리 검색 경로의 일부가 아니므로 컴파일러는 DLL을 찾을 수 없습니다.

내가 SRC/Makevars 읽기를 변경하여이 문제를 해결하기 위해 노력했다 :

PKG_LIBS = -L$(CURDIR) -ldlxapi32 

을하지만 이것은 다음과 같은 출력 실패 : 여기

gcc -shared -s -static-libgcc -o MyPackage.dll tmp.def dlx.o -L/cygdrive/c/DOCUME~1/abiel/LOCALS~1/Temp/Rbuild709236257/MyPackage/src -ldlxapi32 -Lc:/PROGRA~1/R/R-211~1.0/bin -lR 
c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: cannot find -ldlxapi32 

, 우리는 (CURDIR 그 $를 볼 수 있습니다) /cygdrive/c.DOCUME~1/... 나는 src 디렉토리의 실제 위치 인 C :/programming/r/MyPackage/src로 평가되기를 바랬다. 이 문제를 해결할 수있는 방법이 있습니까?

답변

2

지나치게 복잡한 -L$(CURDIR) 대신에 동등한 -L.을 사용하지 않으시겠습니까?

또한, Rtools 스위트는 MinGW 그래서 내가 좋아하는/cygdrive/C/... 등이 여전히 C이다는 MinGW에 경로를 피할 것 Cygwin에서하지 않는 사용/....

+0

감사 더크 - 엘. 완벽하게 일했습니다. – Abiel

+0

다른 디렉토리에 dll을 넣고 싶습니다 (예 : /wlibs/so -L ../ wlibs). 올바른 '설치된'위치 $ {R_LIBRARY_DIR}/$ {R_PACKAGE_NAME}에 복사되도록 정렬하십시오. }/libs /. R CMD 검사는 src /의 바이너리 파일에 대해 불평 할 것입니다. /cleanup.win은 복사를 할 수있는 한 곳입니다. 사용자가 PATH를 지정하면 설치된 dll을 검색 할 수 있어야합니다. 'R 확장 작성하기'섹션 1.2를 참조하십시오. –

+0

좋은 지적. 한 번 비슷한 (내부, 작업 전용) 패키지를 작성하고 inst/file 디렉토리를 통해 패키지에 dll을 제공합니다. 나는 dyn.load()를 어디에서 기대할 것인가에 대해 이야기해야한다고 생각한다. 그것은 모두 작동하지만 약간의 조정이 필요했습니다. –

관련 문제