문제

R (통계 프로그램)에서 사용할 패키지를 만들고 있습니다. 저는이 응용 프로그램을 사용하는 전문가가 아니지만 다음 논리를 사용하여 매우 간단한 패키지를 만들었습니다. 몇 가지 클래스가 있습니다. C ++, 코드를 R 컴파일러를 사용하여 컴파일해야하고 C 코드 만 허용하기 때문에 C ++ 메소드를 호출하는 래퍼 C 코드가 있으며 나중에 C 코드에 노출 된 메소드를 호출하는 R 스크립트가 있습니다. 기본적으로 r <-> c <-> c ++와 같은 커뮤니케이션입니다.

이 패키지를 만들 때 사용한 전체 자습서가 발견되었습니다. 여기, 나는 그것을 참조로 추가합니다.

이제 내 문제는 이미 만든 패키지에 기능을 추가해야한다는 것입니다. 내가해야 할 일은 내가 만든 다른 제품이며 Regasm Tool을 사용하여 등록되는 COM 객체에 늦게 바인딩하기위한 코드를 추가하는 것입니다.

이것은 COM 객체에 늦게 바인딩하기 위해 사용하는 C ++ 코드입니다. idispatch를 사용하려고합니다.

{
...
CLSID clsid;    
HRESULT hr = CLSIDFromProgID((WCHAR*)"My Com object ProgId", &clsid);
if(FAILED(hr))                      
  return;   
...     
}

이 라인만으로 컴파일러가 이미 문제를 일으키기 때문에 전체 코드를 붙여 넣지 않았습니다. 컴파일에 사용하는 명령은 다음과 같습니다.

R CMD SHLIB Cclass.cc C++class.cc

"cclass.cc"에는 C ++ 메소드를 호출하는 C 코드가 있으며 "C ++ Class.cc"는 실제로 C ++ 코드입니다.

이 클래스를 컴파일하면 컴파일러가 말합니다

"undefined reference to `CLSIDFromProgID@8'collect2: ld returned 1 exit status"

"필요한 모든 헤더 파일을 추가했다고 확신합니다. 그래서 내 문제는 정적 라이브러리 인 OLE32.lib 및 Oleaut32.lib를 포함하지 않는다고 생각합니다.

따라서 내 질문은 clsidfromprogid (...) 또는 QueryInterface (...)와 같은 늦은 바인딩 방법을 사용할 수 있도록이 라이브러리를 어떻게 포함 할 수 있습니까? 또한 누군가 내 문제 가이 라이브러리를 연결하는 것이 아니라 다른 것이 있다고 생각한다면, 내 문제가 무엇인지 지적 할 수 있다면 좋을 것입니다.

또한 R 컴파일러가 문제없이 컴파일 할 수있는 방식으로 해당 Statics 라이브러리와 연결해야합니다.

도움이 되었습니까?

해결책

나는 c/c ++에서 이것을 시도하지 않고 오히려 Fortran에서 시도했습니다. 일부 표준 IO 라이브러리가 내가 만든 라이브러리에 포함되지 않았다는 점에서 비슷한 문제가있었습니다. 결국 나는 방금 그들 모두를 포함 시켰고 Fortran 컴파일러를 사용하여 컴파일했습니다. 나는 R 컴파일러 유틸리티를 사용하지 않았으며, 다른 어떤 것과 함께 사용하기 위해 정적 포트란 라이브러리를 일반적으로 컴파일하는 것처럼 컴파일되었습니다. 이것은 잘 작동했습니다.

디버그 경로는 GCC를 사용하여 정적 라이브러리로 컴파일하는 것일 수 있습니다 (또는 사용중인 무엇이든) 다른 C 프로그램에서 정적 라이브러리를 포함시키고 호출하십시오.

이것이 도움이되기를 바랍니다.이 R 패키지를 작성하는 것은 내가 알 수있는 한 바닐라 C 또는 Fortran을 사용하지 않는 한 매우 어렵습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top