C++动态链接库的调用

版权声明:本文为转载文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原为文链接:https://blog.csdn.net/sinat_35866463/article/details/80901327

 

 

DLL的动态调用:

首先创建一个DLL的文件,CreateDLL 
在CreateDLL.h文件中声明你所需要供其他文件调用的函数:

extern "C" _declspec(dllexport) CREATEDLL_API void printMax(int&,int&);

CREATEDLL_API void printMax(int&,int&);

说明:

(1)前面的 extern “C” 告诉编译器函数可以在本模块或其他模块中使用,其中“C”表明需按照C语言方式编译和连接它,因为C++编译时,会对函数名进行修饰,用于实现函数重载,而C里面没有这个功能,所以需要用extern “C”在头文件进行声明的时候加以区分,以便链接时能进行正确地函数名查找。

(2)_declspec(dllexport)为导出函数关键字,意为需从DLL中导出该函数,以便使用。 
(3) printMax 便是自己写的自定义函数了

完成之后在CreateDLL.cpp文件中,添加对printMax函数的定义:

CREATEDLL_API void printMax(int &a,int &b){
    cout<<"the max number is: " <<((a>b)?a:b) << endl;
}

然后便是编译了,编译成功的话会生成一个.dll的文件

调用:

新建一个空的.cpp 项目,填写代码如下:

#include<Windows.h>  
#include<iostream>  
typedef void(*FUNA)(int&,int&);  
typedef void(*FUNB)(int&,int&,int&);  
int main()  
{  
    const char* funName1 = "printMax";  
    int x, y, z;  
    HMODULE hDLL = LoadLibrary(L"CreateDLL.dll");  
    if(hDLL != NULL)  
    {  
        FUNA fp1 = FUNA(GetProcAddress(hDLL,funName1));  
        if(fp1 != NULL)  
        {  
            std::cout<<"Input 2 Numbers:";  
            std::cin>>x>>y;  
            fp1(x,y);  
        }  
        else  
        {  
            std::cout<<"Cannot Find Function "<<funName1<<std::endl;  
        }   
        FreeLibrary(hDLL);  
    }  
    else  
    {  
        std::cout<<"Cannot Find "<<dllName<<std::endl;  
    }  
    return 1;  
}  

说明:

首先typedef 定义一指向void (int&,int&)的函数指针,

HMODULE hDLL = LoadLibrary(L”CreateDLL.dll”); 加载DLL文件, 
FUNA fp1 = FUNA(GetProcAddress(hDLL,funName1)); 往DLL文件中取出目标函数 
若能够正确取到函数所在地址,直接调用即可完成DLL的动态调用。


 

静态调用:


静态调用比较简单粗暴,直接将生编译DLL 文件生成的.dll,.lib,.h文件全部拷贝到要调用函数的exe文件所在的目录下,在调用的.cpp文件中把.h头文件添加进来即可完成DLL的静态调用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言中创建动态供C程序使用的步骤如下: 1. 写好要封装的C语言函数或者模块的代码,并将其保存为一个或多个C文件。 2. 编写一个头文件,将要使用的函数或者模块的声明放在该头文件中。 3. 打开终端或者命令提示符,使用GCC编译器将C文件编译为目标文件。命令如下: `gcc -c 文件名.c -o 输出的目标文件名.o` 这样会将C文件编译为目标文件,目标文件是二进制文件,用来存储编译后的机器码。 4. 将编译好的目标文件打包成动态动态的命名规则为"libxxx.so",其中xxx为动态的名字。命令如下: `gcc -shared 目标文件1.o 目标文件2.o -o libxxx.so` 这样会将目标文件打包成动态动态是一个二进制文件,包含了函数或者模块的机器码。 5. 将生成的动态文件放置到C程序的运行路径下,使用时可通过指定的名字链到该。 6. 在C程序中引入头文件,并调用动态中的函数或者模块。 以上是使用GCC编译器创建动态供C程序使用的基本步骤。通过这种方式封装功能,可以实现代码的模块化和重用,提高程序的可维护性和可扩展性。 ### 回答2: 使用者使用动态的主要目的是为了方便地重复使用某些功能代码。在C语言中,可以使用如下步骤来创建并使用动态。 首先,创建动态的源代码文件,该文件包含了要提供的功能代码。可以使用C语言编写这个文件,其中可能包含一些函数和全局变量等。 下来,使用编译器将源代码文件编译成目标文件。在这个过程中,需要使用适当的编译选项来指定生成动态而不是可执行文件。比如,在GCC编译器中,可以使用"-shared"选项来生成动态。 然后,使用编译器将目标文件链动态文件。这一步会生成扩展名为".so"(在Linux系统上)或".dll"(在Windows系统上)的文件。在该步骤中,需要提供一些额外的链选项,以确保正确地生成动态。 最后,使用者可以在自己的C语言程序中引用和使用动态。可以通过在程序中包含相应的头文件并使用相关的函数和变量来调用动态中的功能。 需要注意的是,使用者在编译和链自己的程序时,需要指定动态的位置和名称,以便在运行时正确加载和使用动态。这可以通过编译选项和链选项来实现。 总之,通过以上步骤,可以创建一个供C语言程序使用的动态,并在程序中使用其中的功能代码。这样可以提高代码的复用性和可维护性,同时也便于程序的调试和更新。 ### 回答3: 编程语言C中的动态(Dynamic Link Library,简称DLL)是一个可重用的代码和数据集合,可以在不同的程序中被调用。以下是创建动态供C使用的基本步骤: 1. 编写C代码:首先,编写包含所需功能的C代码。将这些代码组织成一个或多个函数,这些函数可以是口。 2. 创建头文件:创建一个头文件(.h文件),其中包含的函数声明和必要的常量和类型定义。这个头文件将作为客户端程序与动态之间的口。 3. 编译动态:使用C编译器(例如gcc)将C代码编译成目标文件,使用以下命令生成位置无关的目标文件: ``` gcc -c -fPIC library.c -o library.o ``` 其中,`-c`选项表示只编译不链,`-fPIC`选项表示生成位置无关的代码,`library.c`是你的源代码文件名,`library.o`是生成的目标文件名。 4. 创建动态:使用以下命令将目标文件创建为动态: ``` gcc -shared -o liblibrary.so library.o ``` 其中,`-shared`选项表示生成动态,`-o liblibrary.so`指定输出的文件名为`liblibrary.so`。 5. 安装动态:将生成的动态文件(`liblibrary.so`)复制到系统的默认目录(例如`/usr/lib`)。使用以下命令: ``` sudo cp liblibrary.so /usr/lib ``` 注意:根据操作系统和环境设置,可能需要提供管理员权限。 6. 使用动态:在你的C程序中,通过包含头文件(步骤2)并使用函数声明来调用动态中的函数。编译时需要链动态,可以使用以下命令: ``` gcc client.c -o client -llibrary ``` 其中,`client.c`是你的客户端程序源代码文件名,`-llibrary`表示链名为`liblibrary.so`的动态。 这样,你就成功地创建了一个动态,供其他C程序调用。在客户端程序中,只需要包含头文件并链动态,就能使用其中定义的函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值