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. mysql方言不支持blob类型解决方案

    package com.gstone.history.entity; import java.sql.Types; import org.hibernate.Hibernate; import org ...

  2. Win10下用Anaconda安装TensorFlow

    什么是Anaconda anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项.它是一个用python开发机器学习的必备工具. 什么是ten ...

  3. 利用EF Core的Join进行多表查询

    背景 话说有这么一家子,老公养了一条狗,老婆养了一只猫. 数据库的设计 人表 宠物表 通过表可以知道,宠物通过Owner指向主人的Id. 问题来了,我要和故事开头一样,老公-狗,老婆-猫,对应起来,怎 ...

  4. 25.django Model

    django ORM基本配置 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 1.修改project数据库配置 (1)settigs.py里面 默认 DAT ...

  5. java如何输入数据

    Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代 ...

  6. springboot+springmvc+mybatis项目整合

    介绍: 上篇给大家介绍了ssm多模块项目的搭建,在搭建过程中spring整合springmvc和mybatis时会有很多的东西需要我们进行配置,这样不仅浪费了时间,也比较容易出错,由于这样问题的产生, ...

  7. 【Unity与23种设计模式】责任链模式(Chain of Responsibility)

    GoF中定义: "让一群对象都有机会来处理一项请求,以减少请求发送者与接收者之间的耦合度.将所有的接受对象串联起来,让请求沿着串接传递,直到有一个对象可以处理为止." 举个现实中的 ...

  8. 关于 BigDecimal处理float、double数据

    Big Decimal 在java中,对于float与double中的数据,总会因为精度问题而丢失数据的准确性,也就是说对于两者所处理的得到的值是无限接近于那个数,而并非一个精确数字,而对于电商中所涉 ...

  9. js中的Hook

    1. 简单理解: hook(钩子)就是: 把将要执行的的函数或者一系列动作注册到一个统一的接口下面, 当应用程序调用此接口(即hook)时,就等于调用了这一系列动作.

  10. 【Linux】积累笔记

    ■ 关于查看系统的一些版本信息 查看系统的发行版本可以用 cat /etc/issue 或者 cat /etc/redhat-release (Centos上) 查看系统的内核版本以及系统位数 una ...