2011-02-08 3 views
1

Maven NAR 플러그인을 사용하여 매우 간단한 C++ 프로그램을 작성하려고합니다. 나는 공유 라이브러리를 빌드하기위한 Maven 모듈을 설정했고 라이브러리에 링크하고이를 사용하는 실행 파일을 빌드하기위한 또 다른 모듈을 설정했다. Mac을 기반으로하는 건물은 훌륭하게 작동하며 프로그램을 실행할 수 있습니다. 불행히도 MS Visual C++ (무료 버전)로 Windows (XP)를 구축하는 것은 링커 오류로 실패합니다. 두 컴퓨터 (OS와 컴파일러 제외) 사이의 구성의 유일한 차이점은 Windows 컴퓨터에서 Maven으로 빌드하기 전에 vcvars32.bat를 실행한다는 것입니다. 여기에 내가 점점 오전 오류입니다 :Maven NAR 플러그인을 사용하여 Windows에서 DLL로 연결

link /MANIFEST /NOLOGO /SUBSYSTEM:CONSOLE /INCREMENTAL:NO /OUT:executable.exe 
C:\dev\Projects\trunk\executable\target\nar\obj\x86-Windows-msvc\main.obj 

가 나는 그것이 나와 내 공유 라이브러리 모듈에 의해 생성 된 DLL을해야 기대하지만, : 링커 명령은 NAR 플러그인에서 뱉어

main.obj : error LNK2019: unresolved external symbol "public: int __thiscall 
Calculator::add(int,int)" ([email protected]@@[email protected]) referenced in function 
_main executable.exe : fatal error LNK1120: 1 unresolved externals 

은 다음과 같습니다 그곳에 있지 않습니다. DLL의 NAR은 실행 파일의 대상 디렉토리에 압축이 풀립니다.

Windows 용 NAR 플러그인을 구성하는 데 도움이 될만한 정보가 있습니다. 또는 링커를 올바르게 실행하는 방법을 보여주는 명령 줄이 유용 할 수 있으므로 NAR 구성을 백 필하여이를 성취 할 수 있습니다. 감사.

내 공유 라이브러리 모듈 :

Calculator.h

#ifndef CALCULATOR_H 
#define CALCULATOR_H 

class Calculator { 
public: 
    int add(int first, int second); 
}; 

#endif 

Calculator.cc

#include "Calculator.h" 

int Calculator::add(int first, int second) { 
    return first + second; 
} 

의 pom.xml (조각) :

<groupId>com.mycompany</groupId> 
<artifactId>library</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>nar</packaging> 

... 

<plugin> 
    <artifactId>maven-nar-plugin</artifactId> 
    <version>2.1-SNAPSHOT</version> 
    <extensions>true</extensions> 
    <configuration> 
     <libraries> 
      <library> 
       <type>shared</type> 
      </library> 
     </libraries> 
    </configuration> 
</plugin> 

내 실행 모듈 :

main.cc

#include <iostream> 
#include "Calculator.h" 

int main() { 
    Calculator calculator; 
    std::cout << calculator.add(2, 5) << std::endl; 
} 

의 pom.xml (조각)

<groupId>com.mycompany</groupId> 
<artifactId>executable</artifactId> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>nar</packaging> 

<dependency> 
    <groupId>com.mycompany</groupId> 
    <artifactId>library</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <type>nar</type> 
</dependency> 

... 

<plugin> 
    <artifactId>maven-nar-plugin</artifactId> 
    <version>2.1-SNAPSHOT</version> 
    <extensions>true</extensions> 
    <configuration> 
     <libraries> 
      <library> 
       <type>executable</type> 
      </library> 
     </libraries> 
    </configuration> 
</plugin> 

답변

2

내 자신의 질문에 대답.

내 동료는 그의 두뇌의 어두운 부분을 파고 들고 "dicklespeck"과 같은 것을 상기했다. 그것은 기괴한 소리가났다. 그래서 나는 그것을 "다른 모든 것이 실패한다면 나는 그것을 볼 것이다"버킷에 넣었다. 그 밖의 모든 것이 실패한 후에, 나는 그것에 돌아 왔고, 그가 옳았다는 것을 밝혀내는 다양한 철자법을 봤다. 이 혐오감을 클래스 선언에 추가하면 다음과 같습니다.

__declspec(dllexport) 

DLL이 실행 파일과 성공적으로 연결됩니다.

#ifndef CALCULATOR_H 
#define CALCULATOR_H 

class __declspec(dllexport) Calculator { 
public: 
    int add(int first, int second); 
}; 

#endif 

윽 : 그래서 솔루션처럼

그래서 계산기 헤더 파일을 "고정"! 나는 #define 그 물건을 비 윈도우 빌드를 위해 멀리 만들 수있다. 그러나 아직도 - y!

누군가 나에게 유일한 해결책이 아니라고 말해주십시오.

+0

이것은 내보낼 항목을 표시해야하는 창에서 일반적입니다. 거기에 수출과 수입에 대한 유사 (또는 둘 다 정적 연결) 여기에 합리적인 시작이다 그래서 http://stackoverflow.com/questions/4983835/export-dlls-classes-and-functions-and-import-them-into- win32-application –

+0

다른 옵션은/export : __ function \ _to \ _export__를 링커 플래그에 추가하는 것입니다. 개인적으로는 좋은 정의를 사용하고 gcc의 가시성을 사용하여 링커가 내부 심볼 처리에 너무 많은 시간을 소비하지 않도록 할 수 있습니다. http://gcc.gnu.org/wiki/Visibility를 참조하십시오. – KitsuneYMG

관련 문제