`

gcc编译dll和调用dll(转)

阅读更多

原文: 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

分享到:
评论

相关推荐

    cygwin可以编译生成windows下供调用的dll

    为了使外部程序能够调用DLL中的函数,需要定义哪些函数可以从DLL中导出。这通常通过创建一个`.def`文件来实现。 ##### 1. 编写.def文件 在创建`.def`文件时,需要明确指定哪些函数应该被导出。例如,对于`MyTest....

    Mingw gcc生成dll

    本教程将详细讲解如何使用Mingw GCC生成适用于Windows的动态链接库(DLL),并介绍如何将其与Visual Studio 2013集成,以实现对OpenCV库的封装和调用。 1. 安装Mingw GCC 首先,你需要下载并安装Mingw-w64,这是一...

    PB调用C++ DLL程序范例

    2. **编译C++源代码为DLL**:使用C++编译器(如Visual C++或GCC)将源代码编译成DLL和对应的头文件(.h)。DLL包含实际的函数实现,而头文件声明了函数原型,供PB使用。 3. **定义PB数据类型**:在PB中,需要为C++ ...

    将matlab函数编译成dll供Cpp调用

    #### 四、设置C++环境以调用DLL 1. **创建C++项目**: - 在Visual Studio或其他C++集成开发环境中创建一个新的控制台应用项目。 2. **添加必要的头文件和库路径**: - 在项目的设置中添加`libMyAdd.h`所在目录到...

    wxWidgets dll compiled with gcc 4.7.1

    使用GCC编译wxWidgets库时,需要注意配置正确的编译选项,确保所有依赖项都被正确链接。部署应用程序时,必须包含所有必要的DLL文件,以防止运行时因找不到依赖库而引发错误。对于Windows系统,通常需要将DLL文件...

    lua-cjson-2.1.0 lua第三方库(已编译dll)

    描述中的“已编译dll”意味着这个库已经被编译为动态链接库(Dynamic Link Library)文件,这是一个Windows操作系统下的可执行代码格式。用户只需将这个.dll文件放置在Lua的安装目录下的"clibs"子目录中,无需进行...

    安卓调用C的DLL

    首先,我们需要了解DLL和SO之间的关系。DLL是Windows平台上的动态链接库,而SO是Linux(包括Android)系统中的共享对象文件。虽然两者在不同操作系统上有着不同的格式,但它们都扮演着相同的角色,即提供可重用的、...

    [mingw gcc编译]opencv 3.2 codeblocks可用版本

    bin 文件夹包含了编译生成的动态链接库(.dll 文件)和静态链接库(.a 或 .lib 文件);lib 文件夹则包含了链接时所需的库文件。 5. **集成到 CodeBlocks**:将这三个文件夹解压后,将其内容合并到 CodeBlocks 自带...

    JAVA 对SWMM模型DLL调用

    "JAVA对SWMM模型DLL调用"就是一个典型的跨语言技术应用案例。SWMM(Storm Water Management Model)是一款由美国环保署开发的流行水文和水质模拟软件,常用于城市雨水管理系统。而DLL(动态链接库)是Windows操作...

    c++和matlab调用DLL方法

    ### C++ 和 MATLAB 调用 DLL 方法 #### 一、C++ 写 DLL 方法 在 C++ 中创建 DLL 需要明确哪些函数或类是公开可被其他程序调用的。通常的做法是在头文件中声明这些函数,并且使用特殊的编译指令标记它们。 ##### ...

    fortran调用C++ dll

    2. **生成DLL和导入库**: 使用C++编译器(如Visual Studio或GCC)生成DLL和对应的导入库。导入库是链接阶段的辅助文件,告诉Fortran编译器哪些函数在DLL中。 3. **在Fortran中声明DLL函数**: 在`test.f90`中,我们...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,使得Java代码能够调用本地代码(如C和C++),反之亦然。JNI接口包括了各种函数,让开发者可以...

    Java通过JNI调用C++的DLL文件.docx

    DLL(Dynamic Link Library)文件是一种库文件,包含了可以被其他应用程序调用的函数和变量。DLL 文件可以被多个应用程序共享。 5. 如何在 Linux 环境下编译 C++ 代码? 在 Linux 环境下编译 C++ 代码需要安装 GCC ...

    DLL生成.a库

    DLLTOOL是MinGW32的一部分,它主要用于创建DLL和导入库(.lib文件),也可以用于从DLL中提取导出信息。在我们的转换过程中,DLLTOOL将用来生成一个中间的.def文件,该文件包含了从VC.DLL中提取的导出函数列表。 ...

    Java调用dll实现des加密解密

    4. **加载DLL和调用方法**: 在Java代码中,使用`System.loadLibrary`加载本地库,然后可以调用`DesUtil.encrypt`和`DesUtil.decrypt`进行DES加密解密。 ```java public class Main { public static void main...

    MinGW (GCC编译环境for windows)完整版

    3. 安装完成后,确保MinGW的bin目录(例如`C:\MinGW\bin`)被添加到系统PATH环境变量中,这样你就可以在任何地方通过命令行调用GCC和其他相关工具了。 4. 测试安装是否成功,可以尝试在命令行输入`g++ --version`或`...

    modelsim/questasim-gcc-4.5.0-mingw64编译器

    GCC 4.5.0版本是一个较旧但稳定的版本,它在编译和链接C++代码时能很好地处理一些特定的语法和特性,这些在UVM库中可能被用到。 接下来,让我们详细阐述编译过程: 1. **安装mingw64**:首先,你需要下载并安装...

    jni调用c++ delphi中的dll.

    本主题将深入探讨如何通过JNI来调用C++和Delphi中编译生成的DLL动态链接库。 1. **JNI基础** JNI是Java平台的核心组件之一,它为Java应用程序提供了一个桥梁,使其能够与本地代码交互。JNI提供了一系列的函数接口...

    jna调用dll的例子,包含dll文件和详细说明

    3. **调用DLL函数**:一旦DLL被加载,就可以像调用Java方法一样调用DLL中的函数了: ```java int result = myDll.addNumbers(5, 7); System.out.println("结果:" + result); ``` 4. **示例项目结构**:在"jnademo...

    zxing 在 windows 下的编译包

    需要DLL和lib导入库。我上传的代码不用iconv。通过设置NO_ICONV,可以不需要libiconv,但是扫描结果也没有转换,需要调用方自己做字符集转换。 经过这些,应该可以编译了。 编译它的示例: 这要求有ImageMagick,...

Global site tag (gtag.js) - Google Analytics