windows下命令行编译DLL

windows下命令行编译DLL,第1张

已安装VS2019,以编译一个 CRC32.dll 为例,步骤如下:

dllTest.c 为例:

更优雅的实现应该做一个头文件来方便使用者。如上所示,当头文件被 CRC32.c 包含时,因为 #include "CRC32.h" 之前有一句 #define CRC32_API_IN_DLL 1 ,所以宏 CRC32_API __declspec(dllexport) 。但是当头文件被 dllTest.c 包含时, CRC32_API 又变为 __declspec(dllimport)

把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。\x0d\x0a\x0d\x0a下面是这个例子用到的m代码。它定义了一个名为myadd2的函数\x0d\x0a\x0d\x0afunction [y,z] = myadd2(a, b)\x0d\x0a\x0d\x0a% dummy function, just to demonstrate the idea\x0d\x0a\x0d\x0ay = a+b\x0d\x0a\x0d\x0az = a+2*b\x0d\x0a\x0d\x0aend\x0d\x0a复制代码\x0d\x0a首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:\x0d\x0a\x0d\x0amcc -W cpplib:libmyadd2 -T link:lib myadd2\x0d\x0a复制代码\x0d\x0a结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。\x0d\x0a\x0d\x0a然后在VS2005中创建一个Win32 Console的VC++工程,我在测试时取名为testmyadd2_r2007b。把以上四个文件拷贝到VC++工程的源代码所在目录。\x0d\x0a\x0d\x0a接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VS2005中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。\x0d\x0a\x0d\x0a在VS2005中打开工程testmyadd2_r2007b,选择菜单“Project-->Properties,在出来的对话框上,把MATLAB提供的include路径加到VC++的头文件搜索路径。\x0d\x0a\x0d\x0a然后把相应的lib所在目录加到linker的额外搜索路径上\x0d\x0a\x0d\x0a接下来,告诉VC++,我们的这个程序需要连接到另外两个额外的库函数:libmyadd2.lib和mclmcrrt.lib。中间用空格隔开\x0d\x0a\x0d\x0a最后则是程序代码。这个程序只有一个main函数,其完整代码附在下面给大家参考。\x0d\x0a\x0d\x0a#include "stdafx.h"\x0d\x0a\x0d\x0a#include \x0d\x0a\x0d\x0a#include "mclmcr.h"\x0d\x0a\x0d\x0a#include "mclcppclass.h"\x0d\x0a\x0d\x0a#include "libmyadd2.h"\x0d\x0a\x0d\x0aint _tmain(int argc, _TCHAR* argv[])\x0d\x0a\x0d\x0a{\x0d\x0a\x0d\x0astd::cout 回答于 2022-12-14

使用VC下的cl和link手工创建dll并实现函数导入

1、创建dll头文件:

/*

* dllmain.h

*/

#ifndef _DLLMAIN_H

#define _DLLMAIN_H

int getNumber()

#endif

2、创建dll源文件:

/*

* dllmain.c

*/

#include "dllmain.h"

int getNumber()

{

return 10

}

3、 创建def文件:

export.def

LIBRARY MY_DLLMAIN MY_DLLMAIN 将成为生成的dll的名称

EXPORTS

getNumber @1 这个名称即为函数的实际导出名称 @1为函数的导出编号

4、生成dll文件:

cl dllmain.c /c

link /def:export.def /dll dllmain.obj

这时,工程中已经包含了 dllmain.h dllmain.c export.def dllmain.obj dllmain.lib dllmain.exp MY_DLLMAIN.dll 其中,后4个文件是编译链接过程中生成的文件

5、创建dlltest.c:

/*

* dlltest.c

*/

#include <stdio.h>

#include "dllmain.h" //dll库的头文件

#pragma comment(lib,"dllmain.lib") //dllmain.lib即是上一步生成的文件

int main()

{

printf("%dn",getNumber())

}

6、编译、链接dlltest.c

cl dlltest.c /c

link dlltest.obj

注意:这里dllmain.lib和dllmain.h应该和dlltest.c在同一个目录中。此步的结果将生成 dlltest.exe

7、运行:

dlltest

这时,系统将载入my_dllmain.dll这个动态链接库,将调用其中的getNubmer函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/6040138.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-12
下一篇 2023-03-12

发表评论

登录后才能评论

评论列表(0条)

保存