extern "C" 如果是c语言调用并不需要,加这个是因为c++调用的话,指定c++调用方式和c语言一样. 加这个就是做兼容性的.
#ifndef SHARE_H
#define SHARE_H
#endif
#ifdef __cplusplus //(内置宏,如果是c++,在编译器预处理的时候加上extern,如果是c语言调用的时候是不处理的)
extern "C"
{
#endif
_declspec (dllexport) int sum(int a, int b);
#ifdef __cplusplus
}
#endif
//_declspec (dllexport) 将函数进行导出
_declspec (dllexport) int sum(int a, int b)
{
return a + b;
}
#include <iostream>
#include "shared.h"
int main(int argc,char *argv[])
{
int a = 50;
int b = 100;
int result = sum(a, b);
std::cout << "result =" << result << std::endl;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include "shared.h"
int main(int argc,char* argv[])
{
int a = 50;
int b = 100;
int result = sum(a, b);
printf("result=%d\n", result);
return 0;
}
感谢指教,还有一个问题想问头文件中的语句
#ifdef __cplusplus //(内置宏,如果是c++,在编译器预处理的时候加上extern,如果是c语言调用的时候是不处理的)
extern "C"
{
#endif
_declspec (dllexport) int sum(int a, int b);
#ifdef __cplusplus
}
#endif
我的理解是如果是cpp代码(文件后缀为.cpp)那么函数的声明为
extern "C"
{
_declspec(dllexport) int sum(int a, int b);
}
但是.cpp后缀文件里面的
_declspec (dllexport) int sum(int a, int b)
{
return a + b;
}
这样的话头文件里面函数的声明,和源文件(.cpp)文件的函数的定义就不一致了,这里我还有点疑惑
@蓝海人: 你的理解有误,跟源文件没关系,只是在头文件做了声明。 如果是c++调用的话,编译器内置__cplusplus宏,在编译之前预处理的时候,加上extern "C" ,就是告诉c++编译器,按照c语言的方式调用动态库中的函数.
@秋壶冰月: 现在大概懂了,刚才没读懂这句话的意思,不好意思还有一个问题想问,关于导出dll文件
我在导出dll文件时如果加了
_declspec (dllexport)
那么debug文件夹里面就有lib和dll两个文件,如果没有加_declspec (dllexport)
那么就只有dll文件
为什么加了_declspec (dllexport)
就会多一个lib文件,不加就只有dll文件呢?
@蓝海人: 加 _declspec (dllexport) 代表这个函数被导出,表示这个函数在其他程序可以被调用。可以在dllexp.exe等工具查看到。这个lib(dll生成的lib)文件就是用作静态链接。exp后缀是函数导出的文件
@秋壶冰月: 感谢解答
@蓝海人: 没事