2012-07-30 2 views
1

에서 ARPACK 라이브러리를 실행하려고합니다.VS2010의 ARPACK에 연결

나는 C++ 래퍼 을 ARPACK ++ (일부 배경 - 나는 거대한 행렬의 eigenvalues와 eigenvector를 얻을 필요가있다.)에서 제공하고 싶다. 매우 좋은 자습서는 here입니다. 설명 된대로 내가 mingwg77를 사용하여 포트란 코드를 컴파일 관리 한 튜토리얼에 따라

, 나는 성공적으로 에게 DLL과 LIB를 생성합니다. Visual Studio 프로젝트를 라이브러리에 연결할 때 문제가 발생합니다.

  1. 난 내가 포함 내 "추가로 ARPACK ++ 라이브러리가 포함 된 폴더를 추가 한 간단한 VS2010의 C++ 콘솔 응용 프로그램
  2. 했습니다 다음과 같이

    내가 링크에 노력하고있어 방법은 폴더 추가 라이브러리 디렉토리 "

"난 내에 lib 디렉토리 파일을 containg 디렉토리를 추가 한
  • "추가 종속성"
  • 은 내가 lib 디렉토리 파일을 추가했습니다 " 링커가 언급 한 방법을 찾을 수없는 이유

    >arpackcpp.obj : error LNK2001: unresolved external symbol scopy_ 
    1>arpackcpp.obj : error LNK2001: unresolved external symbol snaupd_ 
    1>arpackcpp.obj : error LNK2001: unresolved external symbol sneupd_ 
    

    가 이해가 안 : 내 말은 오류가

    #include "stdafx.h" 
    #include "arrsnsym.h" 
    
    int _tmain(int argc, _TCHAR* argv[]) 
    { 
        ARrcNonSymStdEig<float> prob(100, 4L); 
        printf("Bok!"); 
        return 0; 
    } 
    

    : 이러한 설정에도 불구하고 617,451,515,

    나는이 짧은 테스트 코드를 컴파일 할 때. 을 검사하면 dllwrap 유틸리티가 생성 한 .def 파일에이 모든 기능이 실제로 포함되어 있으므로 나는이 파일을 사용할 수 있어야한다고 확신합니다. 아직도, 나는 명백한 무엇인가 놓치고 있다고 느낀다.

    UPDATE은 (는 작업 있어요!) :

    내가 구성 설정에서 X86을 을 전환 할 때 32 비트 라이브러리에 64 비트 프로그램을 링크하려고 노력하고 파일 데프 생성 포함 된 것으로 나타났다 구성 등록 정보 -> 링커 -> 입력 -> 추가 정의 파일에서 32 비트 (64 비트 필요)로 작동했습니다. 나를 위해 일한 마지막 해결책은 Linux에서 MinGW와 gfortran을 사용하여 Win64 용으로 컴파일하는 것입니다. 그것은 놀랍게도 잘 작동하고 VS에서 64 비트 C++ 응용 프로그램과 링크 할 수있는 DLL을 생성했습니다. 나는 지금 내가 어떻게 해야할지에 대한 튜토리얼을 작성해야한다고 생각한다.

  • 답변

    0

    내 생각에 이것은 이름 - mangling scheme 문제이다. 포트란에서는 심볼이 오브젝트 파일의 심볼 테이블에 어떤 이름을 가질 지 잘 정의되어 있지 않습니다. 예를 들어 foo이라는 루틴은 기호 표에 foo, FOO, foo_, foo__ 등으로 끝날 수 있습니다. 요즘에는 이중 밑줄을 사용하는 컴파일러가 너무 많습니다 (g77은 예외 임). 나는 ARPACK ++ 래퍼가 하나의 밑줄을 추측하고 있다고 가정하고있다. 여기의 해결책은 컴파일러에서 심볼 이름에 밑줄을 하나 사용하도록 지정하는 것입니다 (사용을 의미하는 g77 포함). gfortran은 새로운 (여전히 지원되는) 오픈 소스 포트란 컴파일러로 기본적으로 밑줄을 긋습니다. 해당 컴파일러를 사용하여 코드를 빌드하려고 할 수도 있습니다. (g77보다 더 최적화 된 출력을 생성 할 수 있습니다.)

    +0

    문제는 64 비트 프로그램에서 32 비트 DLL로 연결되었습니다. 나는 그것 (편집을 보아라.)을 일하게했다. gfortran 제안 주셔서 감사합니다, 그것은 정말 잘 작동하고 Windows에서 생성 된 DLL을 사용하여 전혀 문제가 없었습니다. – Silentbit

    +0

    @ user1563071 - 제대로 작동하는 경우 질문에 대한 답변을 직접 게시하십시오 (가능한 경우 수락). 그렇게하면 다른 사람들이 같은 문제를 겪고 Google 검색에서 이러한 해답을 찾으면 무엇이 당신을 위해 일했는지를 눈에 띄게 볼 수 있습니다. – mgilson