2010-03-10 1 views
1

MSDN에 대한 dll 연습을 진행했는데 정상적으로 작동합니다. 그런 다음 dll에서 모든 C++ 스타일 코드를 제거하고 C 코드로 바꿨습니다. 여전히 작동합니다.C (not C++)에서 Visual Studio에서 dll을 작성하여 해결되지 않은 기호를 발생했습니다.

그러나 파일 이름을 X.cpp (C 모드에서 컴파일이 일어난다 고 생각하는)로 바꿀 때 dll의 모든 함수에 대해 LNK2019 (확인할 수없는 외부 기호) 오류가 발생합니다. 내 목적을 위해 DLL이 C++이 아니어야한다는 것이 중요합니다. Java Native Access가 지원하는 것이기 때문입니다. 여기에 DLL을 사용하는 (C++) 시험 프로그램의 신체의

__declspec(dllexport) double Add(double a, double b); 
__declspec(dllexport) double Subtract(double a, double b); 
__declspec(dllexport) double Multiply(double a, double b); 
__declspec(dllexport) double Divide(double a, double b); 

: 여기

는 DLL의 헤더의

#include <iostream> 
#include "MyMathFuncs.h" 
using namespace std; 
int main() 
{ 
    double a = 7.4; 
    int b = 99; 

    cout << "a + b = " << 
     Add(a, b) << endl; 
    cout << "a - b = " << 
     Subtract(a, b) << endl; 
    cout << "a * b = " << 
     Multiply(a, b) << endl; 
    cout << "a/b = " << 
     Divide(a, b) << endl; 

    return 0; 
} 

(그냥 괜찮아요 명확히하기가 테스트 프로그램 C++에 있으며, C에서 컴파일하려고하는 DLL 일뿐입니다. 확장자를 변경 한 후

+0

게시 MyFuncs.h하시기 바랍니다 (빠른 질문, extern "C"... 올바른 사용합니까?) – KevinDTimm

답변

4

이제 클라이언트 코드에서 잘못된 이름을 사용하고,

extern "C" 
{ 
#include "MyMathFuncs.h" 
} 
+1

또는 더 나은 외부 "C"헤더 파일에 넣어 – Mark

+2

예, # ifdef __cplusplus extern " C "머리에 –

+0

고맙습니다! 이제 파일은 X.c.라는 dll 소스 파일로 컴파일됩니다. 그리고 아직 JNA는 dll을 올바르게로드 할 수 없습니다. ( 더 많은 정보가있을 때 별도의 문제로 게시 할 것입니다. –

1

를 추가합니다. 이 이름들은 더 이상 C++ 코드로 컴파일 할 때 꾸며지지 않았습니다. 그 장식이 사용되지 않도록 적절한 방법은, 같은 이름을 내보내려면 당신은 언어에 의존하지 않는 :

extern "C" __declspec(dllexport) 
double Add(double a, double b); 

내 보낸 이름을 확인하려면 DUMPBIN.EXE/당신의 DLL에 수출을 사용합니다.

관련 문제