1,下面的命令行将这个代码编译成 dll。

gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib

其中 -shared 告诉gcc dlltest.c 文件需要编译成动态链接库。-Wl 表示后面的内容是ld 的参数,需要传递给 ld。 --out-implib,dlltest.lib 表示让ld 生成一个名为 dlltest.lib 的导入库。

如果还需要 .def 文件,则上面的命令行可以写为:

gcc mydll.c -shared -o mydll.dll -Wl,--output-def,mydll.def,--out-implib,mydll.a

动态dll库调用

gcc -m32  -o Test  Test.c  mydll.dll

Test.c

#include"mydll.h"
#include"stdio.h"
#include<stdlib.h>
int main(){
printf("%d\n",add_range(,));
system("pause");
}

下面把我找到的一些信息也记录一下:

gcc 选项 -Wl:用于给链接器传递参数,

-soname:指定动态库的soname (Short for object name)

-output-def = <...> 产生与导出符号相关的def文件

-out-implib = <*.a> 产生用于提供__img_符号的 .a导入库,即*.a文件

def文件可以使用MinGW 附带的工具pexports生成,输入为dll文件,也可以使用VC附带的工具dumpbin 生成。

MinGW 附带的dlltool 工具可以将def 文件转化成 *.a文件。

2,vs静态 lib库调用

#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")

3,在MInGW环境下编译和使用libcurl静态库

libcurl 7.21以后的版本在Windows下的编译比较简单,自带了MinGW和VC环境的Makefile文件,首先去Curl官网下载源代码:http://curl.haxx.se/download.html,任选一个下载即可,推荐这个: curl-7.21.2.tar.gz,下载完成后解压开,打开命令行进入curl源码目录,(在此之前请先设置好MinGW的环境变量): cd curl-7.21.2 编译libcurl库文件: cd lib make -f Makefile.m32 等待编译完成即可 编译curl可执行文件: cd ../src make -f Makefile.m32 一会儿就编译完成了

编译完成后,我们需要复制include头文件和库文件到一个目录供程序开发用

1. 新建curllib目录

2. 新建curllib/include目录,将源代码include目录里的curl文件夹复制到curllib/include目录,这些是使用libcurl需要的头文件 3. 新建curllib/lib目录,将源代码lib目录里编译好的库文件libcurl.a,libcurldll.a,libcurl.dll复制到curllib目录 4. 将MinGW安装目录下lib文件夹里的libwldap32.a和libws2_32.a复制到curllib/lib目录

至此,curllib就是我们开发中要使用到的libcurl的全部文件,下面新建一个测试程序,假设文件名为curltest.c,代码如下:

#include <stdio.h>
#include <curl/curl.h>
int main(void){
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl)
{curl_easy_setopt(curl, CURLOPT_URL, "www.baidu.com");
res = curl_easy_perform(curl);
/* always cleanup */
curl_easy_cleanup(curl);
}
return ;
}

方法一、命令行编译使用licurl的程序

假设测试代码curltest.c位于e:/project 假设curllib文件夹的位置为c:/curllib

1,命令行运行下列命令编译这个测试程序:

cd e:/project

gcc -I. -Ic:/curllib/include -g -O2 -DCURL_STATICLIB -c curltest.c

2,gcc -s -o curltest.exe curltest.o -Lc:/curllib/lib -lcurl -lwldap32 -lws2_32

这时可以看到curltest.c目录下生成了一个curltest.exe文件

接着在命令行输入: curltest.exe 如果看到命令行窗口输出一些HTML代码,就表示编译成功

方法二、Code::Blocks中使用libcurl静态库

1. 新建工程,在工程里添加代码同上的curltest.c文件

2. 将上面curllib/include目录下的curl文件夹复制到MinGW安装目录的include目录

3. 工程名上右键打开Build Options选项,在Compiler Settings选项卡下的#defines里面输入CURL_STATICLIB,(这表示使用静态库) 4. 在Linker Settings选项卡下面的link libraries里添加上面curllib/lib目录里的四个文件: C:\curllib\lib\libcurl.a C:\curllib\lib\libcurldll.a C:\curllib\lib\libwldap32.a C:\curllib\lib\libws2_32.a 然后回到工程页面,点击Build即可

今天为了编译和使用libcurl库折腾了一下午,记下来供需要的人参考,需要注意的是,本文中编译的是不带ssl和zlib支持的libcurl,如果需要编译支持ssl和zlib的curl,还需要先编译openssl,zlib和libssh,编译zlib比较简单,直接使用源码自带的makefile文件即可,编译openssl需要安装MSYS和Perl,还需要修改一些代码,libssh的编译依赖openssl,网上都可以找到方法,也可以看源码的README文件。

mingw打dll ,lib包命令和调用的更多相关文章

  1. Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参

    Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参 一.打包 情况1:不需要向程序传参数,并且程序没有使用第三方jar包 Eclipse上导出jar: 然后选择一个java文件作为入 ...

  2. 如何编写Dll(用命令行编译加深理解)

    DLL的优点 简单的说,dll有以下几个优点: 1)      节省内存.同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内 ...

  3. MSVC vs. MinGW 之dll玩转攻略手记【转

    一份粗糙的研究记录,有待补完和整理. MinGW:c -> o           gcc -c a.cc -> exe         gcc a.c libs.o -o a.exe ( ...

  4. Python一键转Jar包,Java调用Python新姿势!

    粉丝朋友们,不知道大家看故事看腻了没(要是没腻可一定留言告诉我^_^),今天这篇文章换换口味,正经的来写写技术文.言归正传,咱们开始吧! 本文结构: 需求背景 进击的Python Java和Pytho ...

  5. VB6 实现命令行调用时附着到原控制台

    Public Declare Function AttachConsole Lib "kernel32.dll" (ByVal ProcessID As Integer) As B ...

  6. MinGW编译dll并引用

    记得某位神仙曾经说过:一个项目不使用dll简直是一场灾难.(滑稽) 这篇文章以A+B/A-B为范例,来介绍如何在MinGW下编译dll并引用. 首先你要安装MinGW,并配置好环境变量(不配置环境变量 ...

  7. tcpdump抓包命令

    本文转自 : http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html http://www.itshouce.com.cn/l ...

  8. 探索C++的秘密之详解extern "C",这就是为什么很多.lib被我们正确调用确总是无法解析的。

    (转载,绝对的有用) lib被我们正确调用确总是无法解析.这是C++编译和C编译的区别 时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus extern "C&qu ...

  9. 获取DLL的文件路径以及调用DLL的文件路径

    如何在DLL中,获取DLL本身的路径以及调用DLL的文件的路径呢?主要通过GetModuleFileName(HMODULEhModule,LPTSTR lpFilename,DWORD nSize) ...

随机推荐

  1. 关系型数据库工作原理-归并排序(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  2. 记录一次网站漏洞修复过程(二):第一轮处理(IIS目录枚举、应用程序错误)

    解决IIS目录枚举 当前的IIS版本为7.5 [IIS]   => [请求筛选] => [URL]中添加 [拒绝序列] 符号  ~ 应用程序错误 在Global.asax 中添加异常处理代 ...

  3. Unity3D判断角色对敌人是否可见

    在编写敌人AI的状态机时 经常需要判断角色对敌人来说是不是可见的 如果是可见的,则做出追击或者攻击动作 如果是不可见的,则保持idle或者巡逻状态 判断是否可见 包括两个步骤 1.地方角色的视见向量和 ...

  4. ServiceFabric极简文档-1.0 Service Fabric 自定义集群部署

    Service Fabric 部署集群:https://docs.microsoft.com/zh-cn/azure/service-fabric/service-fabric-get-started ...

  5. 理解Spring中的IOC和AOP

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,通过ses ...

  6. c++代码的编译

    1.gcc和g++     1.1搞清楚几个名字         GCC :GNU Compiler Collection (GUN编译套件),可以编译c,c++,java,objective-c,F ...

  7. Python进阶_面对对象&面对过程

    这节主要讲面对对象与面对过程两种编程思想的主要区别. 一. 简单对比 面向过程是一种基础的方法,它考虑的是实际的实现步骤,一般情况下,面向过程是自顶向下逐步求精,其最重要的是模块化的思想方法. 面向对 ...

  8. JSP中动态include和静态include区别

    静态include(<%@ include file=""%>): 静态include(静态导入)是指将一个其他文件(一个jsp/html)嵌入到本页面 jsp的inc ...

  9. kvm之六:配置kvm虚拟机通过VNC访问

    1.网络安装的snale2没有添加VNC访问方式,配置如下 [root@kvm ~ ::]#virsh edit snale2 插入如下配置: <graphics type=' autoport ...

  10. Java的LockSupport工具,Condition接口和ConditionObject

    在之前我们文章(关于多线程编程基础和同步器),我们就接触到了LockSupport工具和Condition接口,之前使用LockSupport工具来唤醒阻塞的线程,使用Condition接口来实现线程 ...