Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >LNK2019:win32下编写DLL,应用程序找不到DLL接口函数的一种情况

LNK2019:win32下编写DLL,应用程序找不到DLL接口函数的一种情况

作者头像
10km
发布于 2019-05-25 14:19:11
发布于 2019-05-25 14:19:11
70800
代码可运行
举报
文章被收录于专栏:10km的专栏10km的专栏
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433648

最近项目技术研究结束,开始代码封装,产品最终是以动态库的形式发布,于是开始整理代码,把原来以静态库方式编译的函数库改为动态库编译,动态库编译正常。

然后用编译测试程序(调用动态库的函数)时报错了,

2>test_detect.obj : error LNK2019: 无法解析的外部符号 “_declspec(dllimport) void __cdecl gdface::set_global_run_config(bool,bool)” (__imp?set_global_run_config@gdface@@YAX_N0@Z),该符号在函数 main 中被引用

令我感到奇怪的是,动态库导出的函数有好几个,只有这个函数报错,我打开生成的动态库导入文件(.lib)。通过字符串查找,的确找不到set_global_run_config函数。这证明是在编译生成动态库的时候,就出了问题。

但为什么偏偏只有这一个函数出问题呢?我仔细比较这个函数和其他函数的区别,发现那些能正常导出符号的函数在同一个cpp文件A中,只有这个问题函数在另一个cpp文件B中。

而A文件有include下面的接口头文件,B文件并没有include这个接口头文件

detect_cl.h

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifndef FACEDETECT_DETECT_CL_H_
#define FACEDETECT_DETECT_CL_H_
#include <vector>
// 动态库导入导出声明宏定义
#ifdef _WIN32
#ifdef DETECT_CL
#define DETECT_CL_DLL_DECL  __declspec(dllexport)
#define DETECT_CL_EXTERN
#else
#define DETECT_CL_DLL_DECL  __declspec(dllimport)
#define DETECT_CL_EXTERN
#endif
#else
#define DETECT_CL_DLL_DECL
#define DETECT_CL_EXTERN
#endif
namespace gdface{
DETECT_CL_DLL_DECL gf_rect_def gf_rect_unnormalization(  const gf_rect_norm &norm_obj,const gf_int2 &img_size);
DETECT_CL_DLL_DECL object_info_vector& convert_def(object_info_vector& objects, const gf_int2 &img_size);
DETECT_CL_DLL_DECL object_info_vector convert_def(const object_info_vector& objects, const gf_int2 &img_size);
DETECT_CL_DLL_DECL void set_global_run_config(bool debug_show,bool kerne_message);
}/*namespace gdface*/
#endif /* FACEDETECT_DETECT_CL_H_ */

于是我在B文件开头加入了#include “detect_cl.h”,编译正常。

结论就是:

对于动态库接口函数,在编译期间就与普通函数有区别,而不只是在连接期间,所以函数所在的cpp/c文件必须#include这个接口函数的定义头文件。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年06月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
c++DLL编程详解
DLL(Dynamic Link Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库
拾点阳光
2018/05/10
2.4K0
VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
本文将创建一个简单的动态库-link,谱写控制台应用程序使用该动态链接库,该动态链接库为“JAVA调用动态链接库DLL之JNative学习”中使用的DLL,仅仅是项目及文件名不同。
全栈程序员站长
2022/07/05
1.4K0
VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性
关于opentelemetry-cpp社区对于C++ Head Only组件单例和符号可见性的讨论小记
前段时间有人在 opentelemetry-cpp 提出了api组件在动态库中单例无法工作的 issue ,( https://github.com/open-telemetry/opentelemetry-cpp/issues/1520 ) 。
owent
2023/03/06
1.1K0
VC++DLL动态链接库程序
最近查找了一下VC++中关于编写DLL动态库的资料,主要是导出函数和导出类的编写。因为在实际项目开发中有时需要使用C++编写好DLL接口,控制设备,提供给其他语言如Nodejs、C#等使用。
ccf19881030
2019/07/10
1.4K0
【Example】C++ 接口(抽象类)概念讲解及例子演示
C++ 和 Java 不同的是,C++ 没有 interface 关键字。对于很多新手来说,C++ 当中接口的概念不容易像 Java 当中那样被理解。
芯片烤电池
2022/04/27
2K0
12、动态链接库,dll
动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。
全栈程序员站长
2022/07/05
8930
12、动态链接库,dll
【Win32】初识Win32编程
编译链接过程:将代码转换为机器语言,将生成的res文件和obj文件加上使用的库链接到一起,整合出一个exe文件,这是用编译器所感受不到的。
半生瓜的blog
2023/05/13
2.2K0
【Win32】初识Win32编程
C++类库隐藏私有属性和方法的两种方式
在我们编写程序的时候,会将程序模块化,常见的就是用动态链接库的方式,然后导出函数接口或者类。而对于导出类的方式,作为模块的实现者,不论是给第三方使用或者自己的项目使用,应该都不太愿意暴露自己的私有属性和方法,个人碰到的主要有以下两个常见原因:
河边一枝柳
2022/06/21
8620
C++类库隐藏私有属性和方法的两种方式
VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)
使用VS2017项目模板创建C++动态库生成工程,生成动态库。然后再创建一个C++工程调用动态库完成测试。
DS小龙哥
2022/01/17
1.2K0
VS2017下创建C++动态库导出符合并完成调用测试(DLL可供C#调用)
lib文件和dll文件的区别_dll2lib
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/167993.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
3K0
c++:动态库接口函数返回stl对象的设计原则塈‘__acrt_first_block == header’异常
版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/80522287
10km
2019/05/26
4.5K0
编译 EasyHook 32-bit/64-bit 静态库 Lib
EasyHook 是 Windows 平台下开源的 APIHOOK 工具库,因其开源有 64 位版本而注广为流传,微软也有提供 64 位 APIHOOK 的代码,但是要收费的。最近公司让我做一个 HOOK 的名单功能,顺便就研究了一下 EasyHook 的静态库编译和使用,也弥补一下曾经再这方面耗费的心血。下图是 HOOK 成功后 DebugView 的输出。
我与梦想有个约会
2023/10/20
4570
编译 EasyHook 32-bit/64-bit 静态库 Lib
手把手教你 封装DLL类 给客户端调用
创建DLL有几种不同的方式,最简单直接的的方式就是通过VS自带的动态链接库(DLL)项目,把相关的功能封装成一个类,然后导出几个接口方法,编译成功以后生成DLL文件,就可以在其他地方跟正常的第三方库配置之后一样调用了。
OpenCV学堂
2023/08/22
9880
手把手教你 封装DLL类 给客户端调用
exe调用DLL的方式
编写dll时,有个重要的问题需要解决,那就是函数重命名——Name-Mangling。解决方式有两种,一种是直接在代码里解决采用extent”c”、_declspec(dllexport)、#pragma comment(linker, "/export:[Exports Name]=[Mangling Name]"),另一种是采用def文件。
CN_Simo
2020/08/20
2.7K0
VS2017生成DLL(C语言)文件并在C#中使用
下面我们将在VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件)
zls365
2021/01/28
2.4K0
window 动态库的创建和使用
File--新建---工程--win32 Dynamic-link Library   输入工程名和位置,即可进入动态库界面。
用户4148957
2022/06/14
1.1K0
VC++的DLL应用(含Demo演示)
      在大学大一的时候学的是C,然后后来大二的时候专业又开了C++这个课程,然后再后来自己又自学了一点VC++,大三的时候也试着编写过一个MFC的最简单的窗口程序。到大四的时候,自己又做了一个GIS的项目,是用C#.NET来编写的,然后发现C#上手好容易,而且还大部分语法规则都沿用了C,C++的习惯,于是觉得C++实在是没有一点优势可言啊。但这个暑假的实习经历又改变了我的观点:C++在写窗口程序虽然麻烦,但是却什么能做,而且对比C#来说,对运行环境的要求不高,不用像C#程序在安装之前还要安装100M多的运行.NET环境。C++和C#各有优缺,目前我对它们俩的定位是:C++用来写一些底层的程序,比如驱动,或者是一些算法类型的函数接口,然后用C#来调用这些接口并进行界面设计。如何函数的实现跨语言呢?显然DLL是个很重要的内容,故在此对VC++的DLL模块进行介绍。
用户1170933
2022/05/10
1K0
VC++的DLL应用(含Demo演示)
Qt中纯C++项目发布为dll的方法(超详细步骤)
目录 一般创建方法 导出普通函数的方法&调用方法 导出类及其成员函数的方法&调用方法 众所周知,我们可以将C++项目中的类以及函数导出,形成 .dll 文件,以供其他程序使用,下面将说明Qt环境下的使
用户1198337
2018/01/19
1.9K0
Qt中纯C++项目发布为dll的方法(超详细步骤)
Win32编程之静态库编写与使用.动态链接库的编写与使用
  静态库其实就是解决模块开发的一种解决方案.在以前.我们写代码的时候.每个人都可以独立写一个项目.但是现在不行了.一个项目往往要很多人一起去编写.而其中用到的技术就类似于静态库.
IBinary
2022/05/10
7930
Win32编程之静态库编写与使用.动态链接库的编写与使用
滴水逆向初级-win32(四)
4.1.C语言中的宽字符 1、常用函数 char wchar_ t //多字节字符类型 宽字符类型 printf wprintf //打印到控制台函数 strlen wcslen //获取长度 strcpy wcscpy //字符串复制 strcat wcscat //字符串拼接 strcmp wcscmp //字符串比较 strstr wcsstr //字符串查找 2、打印宽字符 #include <locale.h> setlocale(LC_ALL,") /
zhang_derek
2021/04/13
2.4K0
推荐阅读
相关推荐
c++DLL编程详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验