精华内容
下载资源
问答
  • C++动态库对外导出函数的方法

    千次阅读 2021-03-17 11:20:22
    1 windows的动态库 在要export的函数声明的前面加上__declspec(dllexport)标识这个函数是从该dll中export出来给其它模块使用的。 declspec是declare specifier的缩写,即声明某种说明符。 加extern "C"时: ...

    1 windows的动态库

    两种方法:

    (1) 一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
    (2) 用__declspec(dllexport)来声明函数,declspec是declare specifier的缩写,即声明某种说明符。

      加extern "C"时:

      extern "C"

    {

     __declspec(dllexport) RETURN_TYPE FUNCTION()

    {

    }

    }
           这是由于在制作DLL导出函数时由于C++存在函数重载,因此__declspec(dllexport)    FUNCTION(int,int)    在DLL会被decorate,例如被decorate成为    function_int_int,而且不同的编译器decorate的方法不同,造成了在用GetProcAddress取得FUNCTION地址时的不便,使用extern    "C"时,上述的decorate不会发生,因为C没有函数重载,如此一来被extern"C"修饰的函数,就不具备重载能力。

    查看导出函数列表:

    使用dumpbin /exports 动态库

    例如:dumpbin /exports “C:\Windows\System32\user32.dll”

     

    2 linux的动态库

    方法

    在linux中,使用gcc进行脚本编译,默认情况下,会将非static的方法以及类都导出到so中

    这种特性让我们方便使用时,有时候也会出现导出库的重名以及冲突

    linux的动态库加载库时,如果存在的就会进行覆盖,最终形成一套函数表,这就有可能会产生部分导出函数冲突,调用后崩溃的现象。

    为了解决这种问题,必须对导出的函数进行规划,让一部分函数变为内部符号,不进行导出。

    要做到这一点,需要做两件事:

     1、对导出的符号进行定义,显示进行导出

     __attribute__((visibility ("default"))) void add(int a, int b)

     使用__attribute__((visibility ("default")))来说明,这个函数需要导出的

     2、对makefile进行修改,设置默认的函数均为local

     %.o:%.cpp

    $(CXX)  -fvisibility=hidden -g -fPIC ${INCLUDE} -o $@ -c $<

    在使用动态库函数时,可加上extern变量表示使用的函数时外部定义的

    查看导出函数列表:

    使用nm工具 nm -D 动态库

    例如: nm -D mylib.so

     

    展开全文
  • 动态库类的创建(适用初学者)(该博客是本人学习过程中自行总结,如有错误,还请斧正)(内含函数,常量的动态库生成与调用)我的环境是VS2005创建步骤:文件-&gt;新建-&gt;项目:win32控制台应用程序默认创建DLL在...

    动态库类的创建(适用初学者)(该博客是本人学习过程中自行总结,如有错误,还请斧正)

    (内含函数,常量的动态库生成与调用)

    我的环境是VS2005

    创建步骤:文件->新建->项目:win32控制台应用程序

    默认创建DLL

    在头文件中创建.h文件Lmath.h和111.h,在源文件中创建Lclass.cpp和lclasschild2.cpp

    这时解决方案应该是这样


    Lmath.h写入如下代码


    111.h写入如下代码



    Lclass.cpp代码如下


    lclasschild2.cpp代码如下


    F7生成DLL动态库(可以到Lclass文件夹下"debug中查看是否生成.lib和.dll文件")

    调用方式有两种

    1:隐式调用(文件->新建->项目:win32控制台应用程序,创建cpp源程序),代码如下(将动态库中的"debug"中的.lib文件和Lclass中的"Lmath.h"拷贝到cpp文件当前目录下)


    调试运行结果如下:


    2:显式调用(文件->新建->项目:win32控制台应用程序,创建cpp源程序),代码如下(将动态库中的"debug"中的.dll文件和Lclass中的"Lmath.h"拷贝到cpp文件当前目录下)


    调试运行结果如下:



    每日一句

    make yourself necessary to someone.

    使自己成为别人需要的人.



    展开全文
  • 动态链接_导出类

    热门讨论 2013-05-30 16:34:13
    本人经过两天的研究,终于...这种方法是我推荐的,它是由动态加载进来的,其中实现原理是:运用抽象,为工程创建接口,通过接口导出类成员函数 这种方式通用性强,而且代码比较的健壮,节省内存。见工程useDLL。
  • 刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都“乱码”了。 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的...

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都“乱码”了。

    导出过程如下:

    新建一个Win32项目:

    image

    新建的解决方案里有几个导出的示例:

    // 下列 ifdef 块是创建使从 DLL 导出更简单的
    // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLLEXPORT_EXPORTS
    // 符号编译的。在使用此 DLL 的
    // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
    // DLLEXPORT_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
    // 符号视为是被导出的。
    #ifdef DLLEXPORT_EXPORTS
    #define DLLEXPORT_API __declspec(dllexport)
    #else
    #define DLLEXPORT_API __declspec(dllimport)
    #endif
    
    // 此类是从 dllExport.dll 导出的
    class DLLEXPORT_API CdllExport {
    public:
        CdllExport(void);
        // TODO: 在此添加您的方法。
    };
    
    extern DLLEXPORT_API int ndllExport;
    
    DLLEXPORT_API int fndllExport(void);

    于是我什么都不做,直接生成,并且在C#里导入看看能否调用,嗯……错误来了:

    image

    找不到入口点?难道是没导出么?我们用“Dependency Walker”来看看:

    image

    Oh, shit, WTF is this? 导出是导出了,不过怎么都乱码了?

     

     

    右键选择“Undecorate C++ Functions”之后才出现了真面目:

    image

    不过我们的目的是要在C#中使用,而不是用眼睛在 Dependency 里面看啊!嗯,既然入口点的名字都变了,要不我们在 C# 中手动指定入口点试试?

    image

    不错,成功了,我们终于可以使用 C++ dll里导出的函数了。

    不过,这些乱码到底是什么东西?百度一下很轻松地找到了答案:

    DLL(动态库)导出函数名乱码含义  
    C++编译时函数名修饰约定规则:    
      __stdcall调用约定:    
      1、以"?"标识函数名的开始,后跟函数名;   
      2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;  
      3、参数表以代号表示:    
      X--void 
      D--char 
      E--unsigned char 
      F--short 
      H--int 
      I--unsigned int 
      J--long 
      K--unsigned long 
      M--float 
      N--double 
      _N--bool 
      ....    
      PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以"0"代替,一个"0"代表一次重复;    
      4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;    
      5、参数表后以"@Z"标识整个名字的结束,如果该函数无参数,则以"Z"标识结束。    
      其格式为"?functionname@@YG*****@Z"或"?functionname@@YG*XZ",例如    
                          int Test1(char *var1, unsigned long)-----?Test1@@YGHPADK@Z

                         void Test2()-----"?Test2@@YGXXZ" 
      __cdecl调用约定:    
      规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YA"。    
      __fastcall调用约定:    
      规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的"@@YG"变为"@@YI"。  

      如果要用DEF文件输出一个"C++"类,则把要输出的数据和成员的修饰名都写入.def模块定义文件    
      所以...   通过def文件来导出C++类是很麻烦的,并且这个修饰名是不可避免的

     

    虽然有约定的含义,但这也真够麻烦的!我不禁想,我们之前导入 User32.dll,Shell32.dll 等等这些动态库的函数的时候,那些EntryPoint没见这么麻烦啊,怎么回事?还是万能的百度……“在到处函数之前加上“extern "C"”就行了!”,我们来试试:

    // 下列 ifdef 块是创建使从 DLL 导出更简单的
    // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLLEXPORT_EXPORTS
    // 符号编译的。在使用此 DLL 的
    // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
    // DLLEXPORT_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
    // 符号视为是被导出的。
    #ifdef DLLEXPORT_EXPORTS
    #define DLLEXPORT_API __declspec(dllexport)
    #else
    #define DLLEXPORT_API __declspec(dllimport)
    #endif
    
    // 此类是从 dllExport.dll 导出的
    class DLLEXPORT_API CdllExport {
    public:
        CdllExport(void);
        // TODO: 在此添加您的方法。
    };
    
    extern "C" DLLEXPORT_API int ndllExport;
    
    extern "C" DLLEXPORT_API int fndllExport(void);

    注意和之前对比,最后两行有变化。编译生成,运行 C# 项目:

    image

    没有指定 EntryPoint 了,成功!

    https://www.cnblogs.com/Leo_wl/p/3310201.html

    展开全文
  • DLL导出类的三种方法,导出接口类导出类指针,导出类,不建议使用导出
  • 有两种方式: 1.使用objdump命令。 例如:objdump -tT xxx.so ...该选项仅对于动态库有意义) 得到的结果中以T开头的就是导出函数 使用awk命令筛选出第二列为-T的行 nm -D libEgisMatcher....

    有两种方式:

    1.使用objdump命令。

    例如:objdump -tT xxx.so

    2.使用nm命令(个人觉得使用nm方式查看更方便。)

    例如 nm -D xxx.so

    (-D或-dynamic选项表示:显示动态符号。该选项仅对于动态库有意义)

    得到的结果中以T开头的就是导出函数

     

     

    使用awk命令筛选出第二列为-T的行

     

    nm -D libEgisMatcher.so | awk '{if($2=="T"){print $3 > 2.txt}}'

     

    展开全文
  • 动态链接dll导出类的方法 VC

    热门讨论 2012-10-23 21:07:02
    动态链接库导出类的demo,压缩文件夹中有两个工程,一个是生成dll的工程一个是调用dll的工程,把生成的dll放到test dll的debug文件夹下就可以调用了,工程是用VS2010编写的。
  • 纯虚函数实现接口并且做成了dll动态链接
  • Linux从动态库导出函数

    千次阅读 2012-08-22 09:53:03
    通过使用 Linux 动态装入器例程,应用程序控制装入哪一个动态库以及调用库中的哪一个函数,以执行装入和链接以及返回所需入口点的地址。 回页首 Linux dll 函数 Linux 提供 4 个库函数( dlopen ...
  • c++动态库导出类方法:

    千次阅读 2019-09-04 11:06:39
    导出类的本质是导出类里面的函数,因为语法上直接导出,没有对函数的调用方式和重命名进行设置,导致了dll并不通用。 //导出C++ class _declspec(dllexport) Stu { public: Stu(int...
  • 注:.dll文件是Windows平台下的动态链接文件,在Linux平台,有响应功能的文件是.so文件,.so文件接口的封装也可以参考此文的思路 目录 一、DLL项目结构介绍 二、DLL项目示例 1.文件 My_Dll_Project.h 2.文件...
  • 第4节给出了以静态链接方式提供add函数接口的方法,接下来我们来看看怎样用动态链接实现一个同样功能的add函数。 如图 3,在VC 中new一个Win32 Dynamic-Link Library工程dllTest。注意不要选择MFC ...
  • 参数为指针类型导出函数 c# Csharp调用 c++ 参数为导入和导出指针两种 包含C++ DLL源码 如fun(cont char* A,char*B) A为输入参数,B为输出参数-C# CSharp call C++ DLL lib dll function param use export and ...
  • C++ linux动态库so导出及使用

    千次阅读 2019-04-03 15:11:36
    linux存在不兼容的函数sprint_s snprintf控制linux动态库导出函数 第一次尝试导出linux动态库,遇到的问题做个记录。 log4cpp linux下编译安装 在官网上下下来包过后,官网的安装说明不全: ./autogen.sh ...
  • 1、导出函数的参数为char*时候,调用规约要使用__stdcall,使用__cdecl会报错。 2、给win32程序添加.def的时候,要在项目属性-》连接器-》输入-》模块定义文件 里面添加你的def,才没有乱七八糟前缀的导出函数。 ...
  • DLL(动态库)导出函数名乱码含义

    千次阅读 2016-01-22 00:54:02
    C++编译时函数名修饰约定规则:  __stdcall调用约定:   1、以"?"标识函数名的开始,后跟函数名;     2、函数名后面以"@@YG"标识参数表的开始,后跟参数表;     3、参数表以代号表示:   X...
  • 查看DLL 及LIB 库导出函数方法

    千次阅读 2018-12-19 09:25:35
    使使用及制作DLL及LIB文件时,经常要确认接口是否已成功导出,今天给大家介绍一个比较简的的方法:   以安装了VS2008开发环境为例 1. 打开Visual Studio 2008命令提示符 2. 进入到DLL或LIB文件所在目标...
  • WINDOWS下的静态链接库LIB和动态...2、动态库DLL编译生成的lib,lib只含函数入口供编译时静态链接使用(使用Win API loadlibrary动态加载dll可以不用这个lib),DLL含函数内容和地址,运行时加载。 3、纯静态库L...
  • 2、导出派生中的函数; 3、通过采用模块定义(.def)文件声明,规范函数导出的名称。导出函数,有些编译器会自动更改名字,增加很多限定符号,可以通过def文件规范化。 创建一个基类:base class base { public...
  • C++模版是否可以作为动态库接口,怎么实现,现在弄出来 template extern "C" __declspec(dllexport) class IDlgT { }; error C2988: 不可识别的模板声明/定义 不能的话请说下原因,不需要解决方式
  • vs2010 导出创建dll 导入使用dll 导出有命名空间的 函数 外部函数
  • 动态调用动态链接(.dll),包括函数的调用

    万次阅读 多人点赞 2018-08-27 16:25:11
    C++,动态链接动态调用,以及如何动态调用中的函数
  • 做为模块开发人员,我们不仅要掌握如何编写和构建动态库,还要了解如何控制动态库导出接口,这样,我们可以向模块的用户仅导出必要的接口,而另一些内部接口,为了安全或其他考虑,可以不必导出。当需要导出C++...
  • c/c++语言写的动态库可以通过
  • 第4节给出了以静态链接方式提供add函数接口的方法,接下来我们来看看怎样用动态链接实现一个同样功能的add函数。 如图 3,在VC 中new一个Win32 Dynamic-Link Library工程dllTest。注意不要选择MFC ...
  • 静态导出函数查看

    千次阅读 2013-10-21 20:07:46
    但是对于静态的lib库函数有哪些导出函数呢? 使用的方法是: dumpbin /LINKERMEMBER Test.lib 这样就可以得到静态库导出的函数。 在导出的文件中,我们知道,如果你是一个静态库的话,那么你必须使用第二条语句...
  • 最近在写dll动态库时,动态库函数返回的std::string对象在析构时抛出了异常: 为简化描述问题,测试代码如下(MSVC /MT 编译),就是返回一个简单的std::string tools.h # if defined(_WIN32) &amp;amp;...
  • 文中是linux下 C++动态库 实现接口提供类导出的一个例子 注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一、介绍 如何使用dlopen API动态地加载C++函数,是Unix C++...
  • MFC制作DLL(导出类函数

    千次阅读 2020-09-19 21:20:45
    学了2天MFC导出DLL,发现网上描述的都不是很彻底,我这里给一个教程,希望大家能参考一次成功。 我用VC6,其他版本基本雷同。 首先,VC6新建项目,如下图流程: 点击文件–保存工作空间,把我们的劳动成果先保存...
  • VS2010下Qt导出动态库的编写

    千次阅读 2015-02-01 20:38:19
    详细介绍Qt中动态链接的使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,496
精华内容 11,798
关键字:

动态库导出函数接口类