首页 新闻 赞助 找找看

extern "C" _declspec(dllexport)生成dll文件问题

0
悬赏园豆:10 [已解决问题] 解决于 2019-05-04 15:31

如图:

编译器是VS2017,编译一直报错,改了很多次
下面这种写法也会报错

百度了一大堆,没有找到合适的解决办法,求指教

Luv3的主页 Luv3 | 初学一级 | 园豆:52
提问于:2019-05-02 20:18
< >
分享
最佳答案
1

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;
}

将头文件拷贝到调用项目根目录,或者在VS配置设置引用头文件目录

c++调用,直接在vs引用动态库项目

#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;
}

c语言调用,直接在vs引用动态库项目

#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;
}
收获园豆:10
秋壶冰月 | 大侠五级 |园豆:5903 | 2019-05-03 20:18

感谢指教,还有一个问题想问头文件中的语句

#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)文件的函数的定义就不一致了,这里我还有点疑惑

Luv3 | 园豆:52 (初学一级) | 2019-05-04 10:11

@蓝海人: 你的理解有误,跟源文件没关系,只是在头文件做了声明。 如果是c++调用的话,编译器内置__cplusplus宏,在编译之前预处理的时候,加上extern "C" ,就是告诉c++编译器,按照c语言的方式调用动态库中的函数.

秋壶冰月 | 园豆:5903 (大侠五级) | 2019-05-04 10:25

@秋壶冰月: 现在大概懂了,刚才没读懂这句话的意思,不好意思还有一个问题想问,关于导出dll文件

我在导出dll文件时如果加了

_declspec (dllexport)

那么debug文件夹里面就有lib和dll两个文件,如果没有加_declspec (dllexport)那么就只有dll文件

为什么加了_declspec (dllexport)就会多一个lib文件,不加就只有dll文件呢?

Luv3 | 园豆:52 (初学一级) | 2019-05-04 10:35

@蓝海人: 加 _declspec (dllexport) 代表这个函数被导出,表示这个函数在其他程序可以被调用。可以在dllexp.exe等工具查看到。这个lib(dll生成的lib)文件就是用作静态链接。exp后缀是函数导出的文件

秋壶冰月 | 园豆:5903 (大侠五级) | 2019-05-04 15:29

@秋壶冰月: 感谢解答

Luv3 | 园豆:52 (初学一级) | 2019-05-04 15:31

@蓝海人: 没事

秋壶冰月 | 园豆:5903 (大侠五级) | 2019-05-04 15:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册