C (C ++ 아님)로 비주얼 스튜디오에서 DLL을 작성하여 해결되지 않은 기호를 일으 킵니다.

StackOverflow https://stackoverflow.com/questions/2419306

  •  19-09-2019
  •  | 
  •  

문제

나는 DLL 연습을 겪고있다 MSDN 그리고 그것은 잘 작동합니다. 그런 다음 DLL의 모든 C ++ 스타일 코드를 제거하여 C와 동등한 것으로 바꾸었지만 여전히 작동합니다.

그러나 파일의 이름을 X.CPP에서 XC로 바꾸면 (C- 모드에서 컴파일을 유발하는 것 같습니다) DLL의 모든 함수에 대해 오류 LNK2019 (해결되지 않은 외부 기호)를 얻습니다. 내 목적을 위해서는 Java Native Access가 지원하는 것이기 때문에 DLL은 C ++가 아닌 C에 있어야합니다.

다음은 DLL의 헤더입니다.

__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을 사용하는 (C ++) 테스트 프로그램의 본문입니다.

#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 일뿐입니다).

도움이 되었습니까?

해결책

추가하다

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

다른 팁

확장자를 변경 한 후 이제 클라이언트 코드에서 잘못된 이름을 사용하고 있습니다. 이 이름은 C ++ 코드로 컴파일했을 때와 마찬가지로 더 이상 장식되지 않습니다. 이와 같은 이름을 내보내는 적절한 방법은 해당 장식이 사용되지 않고 언어에 의존하지 않도록합니다.

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

내보낸 이름을 보려면 dll에서 dumpbin.exe /내보내기를 사용하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top