原文: http://blog.csdn.net/denglei265/archive/2009/02/14/3889470.aspx
方法一:
共有三个文件:print.h,print.c,test.c
***************************************************************
print.h: 文件内容
#ifndef PRINT_H
#define PRINT_H
#ifdef __cplusplus
extern
"
C
"
{
#endif
//打印点东西
void Print(int iNum);
#ifdef __cplusplus
}
#endif
#endif
***************************************************************
***************************************************************
print.c: 文件内容
#include <stdio.h>
#include "print.h"
void Print(int iNum)
{
switch(iNum)
{
case 1:
printf("hello,this is 1\n");
break;
case 2:
printf("ok ,2 now\n");
break;
default:
printf("hihi,default now \n");
break;
}
getch();
return;
}
***************************************************************
***************************************************************
test.c:文件内容
#include <stdio.h>
#include "print.h"
int main()
{
printf("please print a num:\n");
int iNum = -1;
scanf("%d", &iNum);
Print(iNum);
return 1;
}
***************************************************************
编译动态dll库:
gcc -Wall -shared print.c -o print.dll
或者
gcc --share print.c -o print.dll
调用dll库生成exe文件:
gcc test.c print.dll -o test
编译静态库,可供windows调用:
1、gcc -shared -o print.dll print.c -Wl,--output-def,print.def,--out-implib,libprint.a
2、lib /machine:i386 /def:print.def
调用:vs2005
main.c
#include <stdio.h>
#include <stdlib.h>
#include "print.h"
#pragma comment(lib,"print.lib")
int main()
{
Print(1);
system("pause");
return 0;
}
方法二:
两个文件:Foo.c 和 Foo_test.c
***************************************************************
Foo.c:文件内容
#include <windows.h>
#include <stdio.h>
// 这就是按需加载的dll的主函数,dll被加载、卸载时,系统都回调用这个函数,通过dwReason判断
BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpvReserved)
{
switch(dwReason) {
// 如果是进程加载本dll
case DLL_PROCESS_ATTACH:
printf("process attach\n");
break;
// 如果是进程卸载本dll
case DLL_PROCESS_DETACH:
printf("thread attach\n");
break;
// 如果是线程加载本dll
case DLL_THREAD_ATTACH:
printf("thread attach\n");
break;
// 如果是线程卸载本dll
case DLL_THREAD_DETACH:
printf("process attach\n");
break;
}
// 如果返回FALSE,则说明加载失败,不会继续被加载,也不可使用
return TRUE;
}
int foo(char *str)
{
printf("%s\n", str);
return 0;
}
***************************************************************
***************************************************************
Foo_test.c:文件内容
#include <windows.h>
#include <stdio.h>
typedef int (*FOO)(char *str);
int main()
{
HMODULE mod;
FOO foo;
mod = LoadLibrary("lib.dll");
printf("from main\n");
if((foo = (FOO)GetProcAddress(mod, "foo")) != NULL) {
foo("hello world");
}
FreeLibrary(mod);
getch();
return 0;
}
***************************************************************
编译动态dll库:
gcc -Wall -shared Foo.c -o Foo.dll
或者
gcc --share Foo.c -o Foo.dll
调用dll库生成exe文件:
gcc Foo_test.c Foo.dll -o Foo_test
资料:
1、基于MSYS的Win32动态链接库DLL开发:http://code.google.com/p/msys-cn/wiki/Chapter5
分享到:
相关推荐
为了使外部程序能够调用DLL中的函数,需要定义哪些函数可以从DLL中导出。这通常通过创建一个`.def`文件来实现。 ##### 1. 编写.def文件 在创建`.def`文件时,需要明确指定哪些函数应该被导出。例如,对于`MyTest....
本教程将详细讲解如何使用Mingw GCC生成适用于Windows的动态链接库(DLL),并介绍如何将其与Visual Studio 2013集成,以实现对OpenCV库的封装和调用。 1. 安装Mingw GCC 首先,你需要下载并安装Mingw-w64,这是一...
2. **编译C++源代码为DLL**:使用C++编译器(如Visual C++或GCC)将源代码编译成DLL和对应的头文件(.h)。DLL包含实际的函数实现,而头文件声明了函数原型,供PB使用。 3. **定义PB数据类型**:在PB中,需要为C++ ...
#### 四、设置C++环境以调用DLL 1. **创建C++项目**: - 在Visual Studio或其他C++集成开发环境中创建一个新的控制台应用项目。 2. **添加必要的头文件和库路径**: - 在项目的设置中添加`libMyAdd.h`所在目录到...
使用GCC编译wxWidgets库时,需要注意配置正确的编译选项,确保所有依赖项都被正确链接。部署应用程序时,必须包含所有必要的DLL文件,以防止运行时因找不到依赖库而引发错误。对于Windows系统,通常需要将DLL文件...
描述中的“已编译dll”意味着这个库已经被编译为动态链接库(Dynamic Link Library)文件,这是一个Windows操作系统下的可执行代码格式。用户只需将这个.dll文件放置在Lua的安装目录下的"clibs"子目录中,无需进行...
首先,我们需要了解DLL和SO之间的关系。DLL是Windows平台上的动态链接库,而SO是Linux(包括Android)系统中的共享对象文件。虽然两者在不同操作系统上有着不同的格式,但它们都扮演着相同的角色,即提供可重用的、...
bin 文件夹包含了编译生成的动态链接库(.dll 文件)和静态链接库(.a 或 .lib 文件);lib 文件夹则包含了链接时所需的库文件。 5. **集成到 CodeBlocks**:将这三个文件夹解压后,将其内容合并到 CodeBlocks 自带...
"JAVA对SWMM模型DLL调用"就是一个典型的跨语言技术应用案例。SWMM(Storm Water Management Model)是一款由美国环保署开发的流行水文和水质模拟软件,常用于城市雨水管理系统。而DLL(动态链接库)是Windows操作...
### C++ 和 MATLAB 调用 DLL 方法 #### 一、C++ 写 DLL 方法 在 C++ 中创建 DLL 需要明确哪些函数或类是公开可被其他程序调用的。通常的做法是在头文件中声明这些函数,并且使用特殊的编译指令标记它们。 ##### ...
2. **生成DLL和导入库**: 使用C++编译器(如Visual Studio或GCC)生成DLL和对应的导入库。导入库是链接阶段的辅助文件,告诉Fortran编译器哪些函数在DLL中。 3. **在Fortran中声明DLL函数**: 在`test.f90`中,我们...
下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,使得Java代码能够调用本地代码(如C和C++),反之亦然。JNI接口包括了各种函数,让开发者可以...
DLL(Dynamic Link Library)文件是一种库文件,包含了可以被其他应用程序调用的函数和变量。DLL 文件可以被多个应用程序共享。 5. 如何在 Linux 环境下编译 C++ 代码? 在 Linux 环境下编译 C++ 代码需要安装 GCC ...
DLLTOOL是MinGW32的一部分,它主要用于创建DLL和导入库(.lib文件),也可以用于从DLL中提取导出信息。在我们的转换过程中,DLLTOOL将用来生成一个中间的.def文件,该文件包含了从VC.DLL中提取的导出函数列表。 ...
4. **加载DLL和调用方法**: 在Java代码中,使用`System.loadLibrary`加载本地库,然后可以调用`DesUtil.encrypt`和`DesUtil.decrypt`进行DES加密解密。 ```java public class Main { public static void main...
3. 安装完成后,确保MinGW的bin目录(例如`C:\MinGW\bin`)被添加到系统PATH环境变量中,这样你就可以在任何地方通过命令行调用GCC和其他相关工具了。 4. 测试安装是否成功,可以尝试在命令行输入`g++ --version`或`...
GCC 4.5.0版本是一个较旧但稳定的版本,它在编译和链接C++代码时能很好地处理一些特定的语法和特性,这些在UVM库中可能被用到。 接下来,让我们详细阐述编译过程: 1. **安装mingw64**:首先,你需要下载并安装...
本主题将深入探讨如何通过JNI来调用C++和Delphi中编译生成的DLL动态链接库。 1. **JNI基础** JNI是Java平台的核心组件之一,它为Java应用程序提供了一个桥梁,使其能够与本地代码交互。JNI提供了一系列的函数接口...
3. **调用DLL函数**:一旦DLL被加载,就可以像调用Java方法一样调用DLL中的函数了: ```java int result = myDll.addNumbers(5, 7); System.out.println("结果:" + result); ``` 4. **示例项目结构**:在"jnademo...
需要DLL和lib导入库。我上传的代码不用iconv。通过设置NO_ICONV,可以不需要libiconv,但是扫描结果也没有转换,需要调用方自己做字符集转换。 经过这些,应该可以编译了。 编译它的示例: 这要求有ImageMagick,...