2016-06-10 3 views
0

이것은 아마도 중복되었지만 LNK2019 개의 질문이 너무 많아서 모두 읽을 수 없습니다. 여기에 내 문제입니다 : 나는 다음과 같은 오류 메시지가 받고 있어요 :오류 LNK2019 - 이름 장식 - 누락 __imp_

12 B 00002EFF [email protected]@[email protected]@@@Z = @ILT+7930([email protected]@[email protected]@@@Z) 

그것은 __imp__를 제외한 모든 것을 갖추고 있습니다 : 나는 DUMPBIN의 출력을 볼 때

4>ScatterometerView.obj : error LNK2019: unresolved external symbol 
"__declspec(dllimport) public: __thiscall CPGLGraphBitDlgBSDF::CPGLGraphBitDlgBSDF(class CPGLGraph *)" ([email protected]@[email protected]@@@Z) 
referenced in function "public: void __thiscall CScatterometerView::DisplayBSDFPlot(class BSDF *)" ([email protected]@@[email protected]@@Z) 

, 내 생성자를 참조하십시오.

#define PGL_EXT_CLASS _declspec(dllexport) 
class PGL_EXT_CLASS CPGLGraphBitDlgBSDF : public CPGLGraphDlg 
{ 
public: 
    static const int numPointsToAvg = 3; 
    CPGLGraphBitDlgBSDF(); 
    CPGLGraphBitDlgBSDF(CPGLGraph* _pGraph); 
    ~CPGLGraphBitDlgBSDF(void); 
    // ...lots more functions... 
} 

및 실행의 사용은 다음과 같습니다 : 다음과 같이 DLL의 클래스가 정의

CPGLGraph* pGraph = new CPGLGraph; 
// ...code to fill in the graph data... 
m_bsdf_plot = new CPGLGraphBitDlgBSDF(pGraph); 

키커 클래스의 다른 모든 기능이 작동하는 것입니다; 최근에 추가 한 두 개 (이 생성자 포함) 만 작동하지 않습니다. 이전 기능에는 새로 추가 된 기능이 필요하다고 생각되는 __imp__ 장식이 없습니다.

작성된 .def 파일은 기능을 정의하지 않으므로 차이는 없습니다. 링커에서 MAP file을 사용했으며 접두사가 __imp__ 인 유일한 함수는 Microsoft에서 정의한 함수입니다. PGL.dll에 정의 된 단일 함수가 없으며 모두 제대로 작동합니다. 문제 또는 단서를 찾을 곳을 말해주십시오.

답변

0
#pragma once 
#if defined DLL_EXPORT 
#define MY_API_NAME __declspec(dllexport) 
#else 
#define MY_API_NAME __declspec(dllimport) 
#endif 

일반적으로 DLL의 .hpp에 있습니다. DLL 프로젝트를 전 처리기 설정에서 DLL_EXPORT를 정의해야하므로 DLL을 빌드 할 때 함수를 내보내고 다른 프로젝트에서 사용할 때 가져옵니다.

+0

좋은 지적. 내 코드는 PGL (Plot Graphics Library)을 기반으로하며 코드와 거의 동일한 코드가 PGL.h에 이미 있습니다.이 파일은 내 파일에 # 포함되어 있습니다. 다른 아이디어? –

+0

잘 모르겠지만 클래스의 함수를 모두 수동으로 내보내려고합니다. 생성자/소멸자/함수 앞에 PGL_EXT_CLASS를 씁니다. 어쩌면 수출 될 수없는 수업 중에는 시간이 좀 있습니다. –

+0

또 다른 좋은 아이디어! 불행히도, 나는 그것을 시도했을 때 다음과 같은 오류 메시지가 나타납니다 : "dllexport/dllimport로 선언 된 클래스의 멤버는 그 지정자로 선언 할 수 없습니다". 따라서 클래스가 dllexport로 선언되었고 귀하의 최신 제안을 사용할 수 없다는 것이 확실합니다. 적어도 나는 뭔가를 배웠다. –