2015-01-24 2 views
0

.dll을 C++ 프로젝트에 추가하려고합니다. IDE : 내가 무슨 짓을 비주얼 스튜디오 2013Visual Studio에서 추가하는 C++ .dll - 아직 "해결되지 않은 외부 기호"

: VC++ Directories -> Include Directories

에 헤더

  • 추가 디렉토리. 괜찮습니다. 헤더를 포함 할 수 있습니다. 인텔리 센스는 이러한 파일에 이름을 보았습니다.

    • Additional Dependencies 부와 VC++ Directories -> Library DirectoriesLinker -> General -> Additional Library Directories 모두에서이 파일의 경로에 추가 lib 디렉토리 파일입니다.

    • DEBUG 폴더 (또한 확실하게, 단지 을 폴더를 투사하기)

    • 내가 내 .DLL

    에 필요한 모든 클래스를 내 보낸 확인 얻을 dumpbin.exe을 사용하는 배치 실제 .DLL 파일

    그리고 아직 그 .dll에 저장된 함수로 해결되지 않은 외곽선이 있습니다. 어떤 제안?

    이 결과는 question이며 Use library Dependency Inputs을 예로 설정했습니다. 아직도 운이 없다.

    일부 추가 정보를 원하시면 : 오류 예 :

    Error 2 error LNK2019: unresolved external symbol "__declspec(dllimport) public: double __thiscall Fem::Node::GetX(void)" ([email protected]@[email protected]@QAENXZ) referenced in... 
    

    DUMPBIN 출력이 기능 : 나는 이름의 마지막 부분에서 약간의 차이를 볼 수

    172 AB 000F81A0 [email protected]@[email protected]@QEAANXZ 
    

    . 어떻게 든 코멘트에서 언급했듯이 Visual Studio 컴파일러로 Qt 프로젝트에서 작업하게되었습니다.

+0

머리글을 찾습니다. 헤더 디렉토리는 "라이브러리 디렉토리"가 아니라 "디렉토리 포함"으로 이동해야합니다. * .lib 파일이있는 디렉토리를 "라이브러리 디렉토리"에 추가 했습니까? – Wintermute

+0

@Wintermute 죄송합니다. 질문을 제대로 작성하지 못했습니다. 물론, 나는 라이브러리 디렉토리의 .dir과 .lib에 .h를 포함하고 있습니다. –

답변

1

재사용 가능한 라이브러리로 이어지지 않기 때문에 일반적으로 좋지 않습니다. 응용 프로그램을 새 컴파일러 또는 DLL을 다시 작성하지 않고 새 컴파일 설정으로 다시 빌드 할 수 없습니다. 정적으로 사용하는 클래스를 컴파일하는 것이 더 안전합니다. 그렇다면 딜레이 로딩과 함께 사용하면 몇 가지 이점이 있습니다 ...

DLL에 클래스 구현을 저장하려면 DLL을 빌드하는 동안 클래스에 __declspec(dllexport)을 사용해야하며, 그것은 __declspec(dllimport)이어야합니다. 가져 오기 라이브러리에는 무료 함수 참조를 DLL에 전달하는 shim이 있지만 클래스 및 클래스 멤버에는 작동하지 않습니다.

일반적으로 매크로는 dllexportdllimport 사이의 전환을 수행하는 데 사용됩니다.


지금 당신이 엉망이 이름을 표시 한 것으로, 그 차이는 분명되고, 디맹 글링 문제가 어디에서 왔는지에 대한 단서를 제공합니다.

링커는

public: double __thiscall Fem::Node::GetX(void) 

을 찾고있다 그러나 DLL이 호출 규칙이 다르다는 것을

public: double __cdecl Fem::Node::GetX(void) __ptr64 

통지서를 수출; 이것이 링크 된 것이라면이 함수를 호출하자 마자 추락했을 것입니다.

다르게 컴파일 된 응용 프로그램의 C++ 서명이있는 DLL에서 내보내기를 사용할 수 없습니다. 아키텍처를 혼합하고 있습니까 (x86 대 x86_64 대 ARM)? 호환 성이 높은 C 호출 서명을 사용하지 않아도이 작업을 수행 할 수 없습니다.

+0

예, 재사용 가능한 라이브러리로 제작되었습니다. 내가 사용 '# 만약 FEMCOREDLL_EXPORTS #DEFINE FEMCOREDLL_API __declspec (dllexport) #else #DEFINE FEMCOREDLL_API __declspec (같이 DllImport) # endif'/수입 클래스를 내 보냅니다. 또한, 같은 .dll 잘 작동하는 QT 프로젝트 있어요. Visual Studio에서 DLL을 만들었습니다. –

+0

@PavelOganesyan : 질문에 너무 많은 내용이 누락되었습니다. 링커 오류의 예제와 dumpbin 출력의 해당 줄의 예제를 제공하십시오. 아마도 당신은 다른 컴파일러 설정 (구조체 패킹 등)을 통해 One Definition Rule을 위반했기 때문에 컴파일러가 다른 이름을 사용하여 그것을 잡을 수있을만큼 운이 좋았을 것입니다. 그러나 이름이 일치하더라도 아무런 보장이 없습니다. 이렇게하면 응용 프로그램과 DLL간에 강력한 결합이 이루어 지므로 동일한 방법으로 두 가지를 모두 빌드해야합니다. –

+0

질문에 약간의 정보를 추가했습니다. –

관련 문제