MinGW_Eclipse开发静态库和动态库

MinGW_EclipseCDT开发C++动态库、静态库本文主要介绍C++使用MinGW进行跨平台开发时如何创建与使用静态库、动态库。

文章分为以下几个部分:第一部分介绍了Linux和MinGW使用Gcc编译器创建和使用静态库与动态库的基本方法。

第二部分介绍了MinGW与MSVC库间的转换及其调用。

第一部分GCC系列编译器下的静态库与动态库一什么是库所谓库就是已经写好的,成熟的,可以复用的代码—这些代码往往不开源,但在实践中非常有用。

现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,C语言中有stdio和stdlib等;C++中有STL和Boost都是程序员不可缺少的库。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

库有两种:静态库(文件后缀分别为.a、.lib)和动态库(文件后缀分别为.so、.dll)。

所谓静态、动态是指链接。

回顾一下,将一个程序编译成可执行程序的步骤:图:编译过程二静态库之所以称之为静态库,因为编译器在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。

因此对应的链接方式称为静态链接。

试想一下,静态库与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。

其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。

静态库特点总结:●静态库对函数库的链接是放在编译时期完成的。

●程序在运行时与函数库再无瓜葛,移植方便。

●浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。

编译器在编译时将目标文件压缩到一起,并且对其进行编号和索引,以便于查找和检索。

一般创建静态库的步骤如图所示:图:创建静态库过程代码准备:下面编写一些简单的C++类,将其编译成静态库给他人用,程序文件如下所示:(一)GCC型编译器创建与使用静态库Linux静态库命名规则Linux静态库命名规范,必须是"lib[your_library_name].a":lib为前缀,中间是静态库名,扩展名为.a。

Linux创建静态库(.a)通过上面的流程可以知道,Linux创建静态库过程如下:注意带参数-c,否则直接编译为可执行文件生成静态库libstaticmath.a。

大一点的项目会编写makefile文件(CMake等等工程管理工具)来生成静态库,输入多个命令太麻烦了。

(二)MinGw_Eclipse下创建和使用静态库File->New->C++ Project新建一个C++项目:StaticLib在新建项目窗口中依次输入项目名称,选择Static Liberary->Empty Project->MinGW GCC编译器。

创建一个静态库空项目。

然后创建include头文件目录和src 源文件目录(目录类型都为source folder)。

最后根据上面的代码创建一个类,类名为:Calcus。

LibStaticLib.a(三)MinGw_Eclipse使用静态库代码准备:下面编写一些简单的C++类,调用生成的静态库,主程序文件如下所示:File->New->C++ Project新建一个C++项目名称为CallLib。

项目类型选择:Executable->Empty Project-> MinGW GCC。

在项目内新建三个源文件目录(source folder):源文件目录名分别为include,src,libs。

1.将include设为项目的”include”目录。

2.将静态库的头文件引入到include目录中,这里为了简单起见直接将前文创建的静态库头文件拷入该目录。

3.将前文中生成的libStaticLib.a静态库文件拷入libs目录中。

操作后的项目路径如下:右键点击CallLib项目,选择Properties选项,打开项目属性窗口。

在项目属性窗口setting->Libraries->Library search path为当前项目的libs目录。

在Libraries 选项卡中输入静态库libStaticLib.a文件名为StaticLib(文件名去掉lib和后缀)。

注意:如果文件名不以lib开头,直接输入全部文件名的前缀。

最后点击OK。

编译和运行该项目,可以看到输出结果:三动态库通过上面的介绍发现静态库,容易使用和理解,也达到了代码复用的目的,那为什么还需要动态库呢?●空间浪费是静态库的一个问题。

●另一个问题是静态库对程序的更新、部署和发布页会带来麻烦。

如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新)。

静态库的内存布局动态库的内存布局动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。

不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。

动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。

用户只需要更新动态库即可,增量更新。

动态库特点总结:●动态库把对一些库函数的链接载入推迟到程序运行的时期。

●可以实现进程之间的资源共享。

(因此动态库也称为共享库)●将一些程序升级变得简单。

●甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

(一)GCC型编译器创建与使用动态库linux动态库的命名规则动态链接库的名字形式为libxxx.so,前缀是lib,后缀名为“.so”。

●针对于实际库文件,每个共享库都有个特殊的名字“soname”。

在程序启动后,程序通过这个名字来告诉动态加载器该载入哪个共享库。

●在文件系统中,soname仅是一个链接到实际动态库的链接。

对于动态库而言,每个库实际上都有另一个名字给编译器来用。

它是一个指向实际库镜像文件的链接文件(lib+soname+.so)。

Linux下创建动态库(.so)编写四则运算动态库代码:●首先,生成目标文件,此时要加编译器选项-fpic-fPIC 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。

然后,生成动态库,此时要加链接器选项-shared-shared指定生成动态链接库。

其实上面两个步骤可以合并为一个命令:Linux下使用动态库编写使用动态库的测试代码:引用动态库编译成可执行文件(跟静态库方式一样):然后运行:./a.out,发现竟然报错了可能大家会猜测,是因为动态库跟测试程序不是一个目录,那我们验证下是否如此:发现还是报错那么,在执行的时候是如何定位共享库文件的呢?1) 当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。

此时就需要系统动态载入器(dynamic linker/loader)。

2) 对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的 DT_RPATH段—环境变量LD_LIBRARY_PATH—/etc/ld.so.cache文件列表—/lib/,/usr/lib 目录找到库文件后将其载入内存。

如何让系统能够找到它:●如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。

●如果安装在其他目录,需要将其添加到/etc/ld.so.cache文件中,步骤如下:⏹编辑/etc/ld.so.conf文件,加入库文件所在目录的路径⏹运行ldconfig ,该命令会重建/etc/ld.so.cache文件我们将创建的动态库复制到/usr/lib下面,然后运行测试程序。

(二)MinGw_Eclipse下创建和使用动态库File->New->C++ Project新建一个C++项目:DynamicLib在新建项目窗口中依次输入项目名称,选择Shared Liberary->Empty Project->MinGW GCC编译器。

创建一个动态库空项目。

然后创建include头文件目录和src 源文件目录。

最后根据上面的代码创建一个类,类名仍为:Calcus。

创建后项目目录结构如下:与构建静态库相同,选中Build Project构建DynamicLib的动态库。

生成一个lib DynamicLib.dll文件。

(三)MinGw_Eclipse使用动态库代码准备:下面编写一些简单的C++类,调用生成的静态库,主程序文件如下所示:加载动态链接库File->New->C++ Project新建一个C++项目名称为CallLibs。

项目类型选择:Executable->Empty Project-> MinGW GCC。

在项目内新建三个源文件目录(source folder):源文件目录名分别为include,src,libs。

这里动态库目录为libs(该目录必须为源文件目录)。

1.将include设为项目的”include”目录。

2.将动态库的头文件引入到include目录中,这里为了简单起见直接将前文创建的动态库头文件拷入该目录。

3.将前文中生成的libDynamicLib.dll动态库文件拷入libs。

操作后的项目路径如下:右键点击CallLib项目,选择Properties选项,打开项目属性窗口。

方法一:内部引用法在项目属性窗口setting->Libraries->Library search path为当前libs。

在Libraries 选项卡中输入动态库libDynamicLib.dll文件名为DynamicLib(文件名去掉lib和后缀)。

注意:如果文件名不以lib开头,直接输入全部文件名的前缀。

最后点击OK。

编译和运行该项目,可以看到输出结果:方法二:环境变量法回到桌面->计算机->属性->高级系统设置->环境变量在”LIBRARY_PATH”选项中加入当前dll所在的绝对“E:\WorkSpace\Cpp-GBK\CallLibs”路径。

重新编译项目,可以看到输出结果:环境变量可以在软件安装之时自动设置到系统中。

因此,该方法为MinGW C++项目的标准方法。

第二部分MinGW与MSVC的库转换上文列举了创建和使用MinGW静态库和动态库的各种方法。

这些操作一定程度满足了项目开发的需求。

但在实践中可以发现一个有趣的现象: MinGW中创建的动态库的后缀也是.dll。

这类动态库与MSVC的动态库有什么区别和联系吗?本部分就来探讨一下这个主题。

合集下载

静态库和动态库编译

静态库和动态库编译

静态库和动态库编译静态库和动态库是编程中常用的两种库文件形式,本文将介绍它们的编译过程和使用方法。

1. 静态库编译静态库是一种在编译时被链接到程序中的库文件,它包含了程序所依赖的所有函数和数据结构,因此程序在运行时不需要再加载库文件。

静态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件(.o 或 .obj)。

(2)将多个目标文件打包成一个静态库文件,通常使用 ar 工具完成此操作。

例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.a 的静态库文件:$ ar rcs libfoo.a foo1.o foo2.o ...其中,rcs 参数分别表示创建、向库文件中添加目标文件和生成索引表。

(3)在编译器中使用静态库,需要将其链接到目标程序中。

在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.a 的静态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 参数指定库文件搜索路径,. 表示当前目录;-l 参数指定链接库文件,实际上是将其前缀 lib 和后缀 .a 去掉,即 foo。

2. 动态库编译动态库是一种在程序运行时动态加载的库文件,它只包含程序所需要的部分函数和数据结构,因此可以减小程序的尺寸和加载时间。

动态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件。

(2)将多个目标文件打包成一个共享库文件,通常使用 ld 或链接器完成此操作。

例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.so 的动态库文件:$ gcc -shared -o libfoo.so foo1.o foo2.o ...其中,-shared 参数表示生成共享库文件。

(3)在编译器中使用动态库,需要将其链接到目标程序中。

在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.so 的动态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 和 -l 参数的含义同静态库。

动态库和静态库的制作过程

动态库和静态库的制作过程

动态库和静态库的制作过程我们通常把一些公用函数制作成函数库,供其它程序使用。

函数库分为静态库和动态库两种。

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。

在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。

第1步:编辑得到举例的程序--hello.h、hello.c和main.c;hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello XXX!"。

hello.h(见程序1)为该函数库的头文件。

main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。

#ifndef HELLO_H#define HELLO_Hvoid hello(const char *name);#endif //HELLO_H程序1: hello.h#include <stdio.h>void hello(const char *name){printf("Hello %s!\n", name);}程序2: hello.c#include "hello.h"int main(){hello("everyone");return 0;}程序3: main.c第2步:将hello.c编译成.o文件;无论静态库,还是动态库,都是由.o文件创建的。

因此,我们必须将源程序hello.c通过gcc先编译成.o文件。

在系统提示符下键入以下命令得到hello.o文件。

# gcc -c hello.c#(注1:本文不介绍各命令使用和其参数功能,若希望详细了解它们,请参考其他文档。

另辟蹊径-利用MSYS2安装MinGW+Qt开发环境(含32位-64位-动态库-静态库-qwt-opencv等等)

另辟蹊径-利用MSYS2安装MinGW+Qt开发环境(含32位-64位-动态库-静态库-qwt-opencv等等)

另辟蹊径-利用MSYS2安装MinGW+Qt开发环境(含32位-64位-动态库-静态库-qwt-opencv等等)By Winland, 2015.04.04本文介绍在Windows系统里MSYS2 环境和MinGW-w64 编译套件安装、Qt开发环境安装。

一、MSYS2及其安装使用1、MSYS2介绍这得从MinGW 和MSYS说起,原本GNU 工具只在Linux/Unix 系统里才有,随着Windows 系统的广泛使用,为了在Windows 系统里可以使用GNU 工具,诞生了MinGW (Minimalist GNU for Windows)项目,利用MinGW 就可以生成Windows 里面的exe 程序和dll 链接库。

MinGW只是编译工具集没有类似Unix命令行环境,所以为了进一步在Windows 系统上使用类Unix环境,MinGW项目组衍生了MSYS子项目,该项目从Cygwin派生,构造了一个类Unix命令行环境,并提供POSIX功能支持。

MinGW本身仅支持生成32位程序,而MinGW-w64项目相当于是MinGW的升级版,同时支持生成32位和64位程序。

MSYS2也是MSYS的衍生版,使用MinGW-w64编译工具集。

另外MSYS2还有一个非常强大的功能,它从Arch Linux引入了软件包管理器pacman工具,使得MSYS2功能扩展非常方便,并且可以通过pacman来解决各个软件和库之间的依赖关系,自动安装需要的依赖软件包。

MSYS2项目还打包了非常多的开发库和开发工具,能移植到Windows上的估计都打包了,而且还可以进行扩展。

因此通过MSYS2的pacman工具安装诸如MinGW-w64编译工具集、Qt 开发库和QtCreator、qwt绘图插件、opencv开发库、ffmpeg、gstreamer、openssl、sqlite、postgresql、gtk、crypto++、mesa、openal、tcl/tk、vlc、zlib、SDL等,都是易如反掌。

另辟蹊径-利用MSYS2安装MinGW+Qt开发环境(含32位-64位-动态库-静态库-qwt-opencv等等)

另辟蹊径-利用MSYS2安装MinGW+Qt开发环境(含32位-64位-动态库-静态库-qwt-opencv等等)

另辟蹊径-利用MSYS2安装MinGW+Qt开发环境(含32位-64位-动态库-静态库-qwt-opencv等等)By Winland, 2015.04.04本文介绍在Windows系统里MSYS2 环境和MinGW-w64 编译套件安装、Qt开发环境安装。

一、MSYS2及其安装使用1、MSYS2介绍这得从MinGW 和MSYS说起,原本GNU 工具只在Linux/Unix 系统里才有,随着Windows 系统的广泛使用,为了在Windows 系统里可以使用GNU 工具,诞生了MinGW (Minimalist GNU for Windows)项目,利用MinGW 就可以生成Windows 里面的exe 程序和dll 链接库。

MinGW只是编译工具集没有类似Unix命令行环境,所以为了进一步在Windows 系统上使用类Unix环境,MinGW项目组衍生了MSYS子项目,该项目从Cygwin派生,构造了一个类Unix命令行环境,并提供POSIX功能支持。

MinGW本身仅支持生成32位程序,而MinGW-w64项目相当于是MinGW的升级版,同时支持生成32位和64位程序。

MSYS2也是MSYS的衍生版,使用MinGW-w64编译工具集。

另外MSYS2还有一个非常强大的功能,它从Arch Linux引入了软件包管理器pacman工具,使得MSYS2功能扩展非常方便,并且可以通过pacman来解决各个软件和库之间的依赖关系,自动安装需要的依赖软件包。

MSYS2项目还打包了非常多的开发库和开发工具,能移植到Windows上的估计都打包了,而且还可以进行扩展。

因此通过MSYS2的pacman工具安装诸如MinGW-w64编译工具集、Qt 开发库和QtCreator、qwt绘图插件、opencv开发库、ffmpeg、gstreamer、openssl、sqlite、postgresql、gtk、crypto++、mesa、openal、tcl/tk、vlc、zlib、SDL等,都是易如反掌。

mingw环境中使用dlltool工具来生成动态库的步骤

mingw环境中使用dlltool工具来生成动态库的步骤

Example:file1.c:asm (".section .drectve");asm (".ascii \"-export:adef\"");void adef (char * s){printf ("hello from the dll %s\n", s);}void bdef (char * s){printf ("hello from the dll and the other entry point %s\n", s);}file2.c:asm (".section .drectve");asm (".ascii \"-export:cdef\"");asm (".ascii \"-export:ddef\"");void cdef (char * s){printf ("hello from the dll %s\n", s);}void ddef (char * s){printf ("hello from the dll and the other entry point %s\n", s);}int printf (void){return 9;}themain.c:int main (void){cdef ();return 0;}thedll.defLIBRARY thedllHEAPSIZE 0x40000, 0x2000EXPORTS bdef @ 20cdef @ 30 NONAMESECTIONS donkey READ WRITEaardvark EXECUTE#下面开始编译的过程# 第1步、编译成.o文件# Compile up the parts of the dll and the programgcc -c file1.c file2.c themain.c# 第2步、建立static库(静态库)# Optional: put the dll objects into a library# (you don't have to, you could name all the object# files on the dlltool line)ar qcv thedll.in file1.o file2.oranlib thedll.in# 第3步、用dlltool工具从def文件导出.lib(import表,用于生成exe文件时,进行的连接接口库)和.exp文件(export表,用于生成dll时所使用)# Run this tool over the DLL's .def file and generate an exports# file (thedll.o) and an imports file (thedll.a).# (You may have to use -S to tell dlltool where to find the assembler).dlltool --def thedll.def --output-exp thedll.o --output-lib thedll.a# 第4步、生成dll模块,需要静态库和export表# Build the dll with the library and the export tableld -o thedll.dll thedll.o thedll.in# 第5步、生成exe模块。

Windows下通过MinGW进行WxWidgets的动态编译与静态编译

Windows下通过MinGW进行WxWidgets的动态编译与静态编译

Windows下通过MinGW进⾏WxWidgets的动态编译与静态编译1.在Window中下载MingW2.为MingW设置环境变量,确保在CMD中可以找到ming32-make。

3.下载wxWidgets的源码包4.在CMD中进⼊wxWidgets\build\msw,执⾏下⾯的命令进⾏编译(根据⾃⼰的需要进⾏编译,不⽤全部编译)MONOLITHIC=1的含义:将⽣成的库⽂件整合的⼀个⽂件中,这个⽂件会很⼤。

所以我⼀般将MONOLITHIC设置为0。

动态库debug版本:mingw32-make -f makefile.gcc MONOLITHIC=0 SHARED=1 UNICODE=1 BUILD=debug动态库release版本:mingw32-make -f makefile.gcc MONOLITHIC=0 SHARED=1 UNICODE=1 BUILD=release静态库release版本:mingw32-make -f makefile.gcc MONOLITHIC=0 SHARED=0 UNICODE=1 BUILD=release上⾯编译完成后,会⽣成对应的lib库静态库⽂件wxWidgets\lib\gcc_lib静态库所需的头⽂件,release版本在mswu中,debug版本在mswud中,因为我们没有⽣成静态库的debug版本,所以不会出现mswud这个⽂件夹。

wxWidgets\lib\gcc_lib\mswu动态库⽂件wxWidgets\lib\gcc_dll静态库所需的头⽂件,release版本在mswu中wxWidgets\lib\gcc_dll\mswu静态库所需的头⽂件,debug版本在mswud中wxWidgets\lib\gcc_dll\mswud5.写个测试⽂件Hello.cpp#include <wx/wx.h>class Simple : public wxFrame{public:Simple(const wxString& title);};Simple::Simple(const wxString& title): wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 150)){Centre();}class MyApp : public wxApp{public:virtual bool OnInit();};IMPLEMENT_APP(MyApp)bool MyApp::OnInit(){Simple *simple = new Simple(wxT("Simple"));simple->Show(true);return true;}6.在CMD中进⼊Hello.cpp所在的⽂件夹,输⼊下⾯的编译命令:动态库(Release)版本:g++ minimal.cpp -o minimal -I C:\MyProgram\wxWidgets-3.1.0\include -I C:\MyProgram\wxWidgets-3.1.0\lib\gcc_dll\mswu -LC:\MyProgram\wxWidgets-3.1.0\lib\gcc_dll -lwxmsw31u_xrc -lwxmsw31u_html -lwxmsw31u_adv -lwxmsw31u_core -lwxbase31u_xml -lwxbase31u_net -lwxbase31u -lwxtiff -lwxjpeg -lwxpng -lwxzlib -lwxregexu -lwxexpat -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwxregexu -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lShlwapi -lversion静态库(Release)版本:g++ minimal.cpp -o minimal -I C:\MyProgram\wxWidgets-3.1.0\include -I C:\MyProgram\wxWidgets-3.1.0\lib\gcc_lib\mswu -LC:\MyProgram\wxWidgets-3.1.0\lib\gcc_lib -lwxmsw31u_xrc -lwxmsw31u_html -lwxmsw31u_adv -lwxmsw31u_core -lwxbase31u_xml -lwxbase31u_net -lwxbase31u -lwxtiff -lwxjpeg -lwxpng -lwxzlib -lwxregexu -lwxexpat -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwxregexu -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lShlwapi -lversion动态库(Debug)版本:g++ minimal.cpp -o minimal -I C:\MyProgram\wxWidgets-3.1.0\include -I C:\MyProgram\wxWidgets-3.1.0\lib\gcc_dll\mswu -LC:\MyProgram\wxWidgets-3.1.0\lib\gcc_dll -lwxmsw31ud_xrc -lwxmsw31ud_html -lwxmsw31ud_adv -lwxmsw31ud_core -lwxbase31ud_xml -lwxbase31ud_net -lwxbase31ud -lwxtiff -lwxjpeg -lwxpng -lwxzlib -lwxregexu -lwxexpat -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwxregexu -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lShlwapi -lversion ※关于wxWidgets静态库版本必须的库⽂件静态链接时需要的wxWidgets库 (xx is wxWidgets version, such as 30):libwxmswxxu_core.alibwxbasexxu.alibwxpng.alibwxjpeg.alibwxtiff.alibwxzlib.a静态链接需要额外链接Windows的库(在mingw\lib\⽬录下)libole32.alibuuid.alibcomctl32.aliboleaut32.alibcomdlg32.alibwinspool.alibgdi32.alibShlwapi.alibversion.a※去除默认⽣成的wxWidgets程序的控制台窗⼝由于编译时使⽤的是控制台⽅式,所以⽣成的程序会多出⼀个控制台窗⼝,应该使⽤GUI⽅式。

配置Eclipse+MinGW开发C-C++程序

配置Eclipse+MinGW开发C/C++程序作者:jamesfancy 出处:CSDNEclipse 3.3已经发布好一段时间了。

我曾用Eclipse之前的版本加上CDT组件开发C/C++程序。

但是也许是因为对配置不够熟悉的缘故,配置起来非常痛苦,使用起来也觉得特别别扭,所以最后还是不得不换用了VC 2005 Express。

Eclipse 3.3的下载页面中,针对不同的开发人员提供了不同的下载包。

其中“Eclipse IDE for C/C++ Developers”一项让人有“Eclips e能很好的支持C/C++开发”的感觉。

毕竟这是一个针对C/C++开发的专版,不像安装插件那样让人始终觉得有“附加功能”的感觉。

下载Eclipse IDE for C/C++ Developers之后第一件事就是查阅帮助。

“Before you begin”一章说明Windows用户主要应使用MinGW或Cygwin的C/C++开发环境,并对使用MinGW的情况加以大篇幅的说明。

看样子在Windows下使用Eclipse CDT作为IDE开发C/C++,想使用VC的编译器难度有点大,而用MinGW环境应该是最优选择。

在MinGW主页(/)很容易找到MinGW的下载页面。

之后看到一大堆需要下载的包,头都大了。

于是决定下载Automated MinGW Installer,让它在线下载安装MinGW及一些需要的组件。

几本上只需要安装gcc组件就够了。

打开Eclipse,照例是HelloWorld。

不过在开始写程序之前还是习惯性地先去看看配置选项。

General->Editors->Text Edtiors里把Show line numbers勾上了。

按照编码规范每行代码是不应该超过80个字符的,所以勾上了Show print margin并将Print margin column设置成80。

毕竟有一条参考线在编辑窗口中心里更有底。

动态库和静态库

xianga…11月23日正文字体大小:大中小静态库与动态库的建立与使用(2011-11-03 13:27:55)转载▼分类:C/C标签:杂谈转《深入浅出Visual C++动态链接库编程》作者宋宝华静态链接库就是你使用的.lib文件,库中得代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。

引用:一、通用:格式如:#pragma comment(lib,"XXX.lib") //指定与静态库一起连接二、针对开发环境:1、如果使用VC,可以在Project Setting--&gt;Link中加入你的静态库,也可以直接把该.lib 文件加入到你的工程中2、如果使用Visual Studio,位置在项目→配置属性→连接器→输入→附加依赖项中加入.lib文件静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。

这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。

静态链接库对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。

图1 建立一个静态链接库如图1,在VC++6.0中new一个名称为libTest的static library工程(单击此处下载本工程附件),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下://文件:lib.h#ifndef LIB_H#define LIB_Hextern "C" int add(int x,int y);//声明为C编译、连接方式的外部函数#endif//文件:lib.cpp#include "lib.h"int add(int x,int y){return x + y;}编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。

如何在vc中使用mingw编译出来的动态库和静态库

如何在vc中使⽤mingw编译出来的动态库和静态库
mingw编译出来的静态库后缀名为.a,编译出来的动态库的导⼊库后缀名为.dll.a,⽽在windows下后缀名为.lib的库可能是静态库也可能是动态库的导⼊库。

mingw编译出来的动态库的导⼊库可以直接在vc中直接使⽤,例如
#pragma comment(lib, "libx264.dll.a")
这样你就不需要⽣成⼀个.lib后缀的动态库的导⼊库了,⽹上也有如何从.dll⽣成.lib的⽅法。

如果链接了动态库的导⼊库libpthread.dll.a,你发布的应⽤程序就要带上pthread的dll。

使⽤静态库的好处是发布的应⽤程序组件模块⾥不需要带上相关的dll,如果要使⽤mingw编译出来的静态库,可以如下:
#pragma comment(lib, "libx264.a")
但是仅仅链接这么⼀个静态库是不够的,你还需要链接
libgcc.a
libmingwex.a
你可能还需要链接libmsvcrt.a
否则会报⼀堆错误:error LNK2001: ⽆法解析的外部符号
上⾯的这些库在C:\MinGW\lib⽬录或⼦⽬录下⾯可以找到。

链接这些库的原因是mingw使⽤的gcc编译器和vc编译器之间存在差异。

Eclipse 编写cc++程序与MinGW的配置

1)MinGW安装在windows环境下必须要先安装c++编译器。

MinGW是一个比较好的选择。

下载地址:/projects/mingw/?source=dlp选择c++编译器,网速快的10分钟可以下载安装完成。

2)配置MinGw环境变量环境变量可能会在安装过程中自动设置好,在cmd中输入gcc测试一下,假如显示 gcc: no input file ,则安装已成功。

否则,自己把c:/mingw/bin的目录手动加到环境变量中。

“我的电脑”==>属性==>“高级”==>“环境变量”.在用户变量中,假如有path变量,就选择“编辑”,在原先值后面加个分号,在把MinGW 的bin目录加上就好了。

假如没有path就自己“新建”一个,再把MinGW的bin目录加上。

重新打开新的cmd,DOS窗口下测试gcc命令。

3)Ec lipse的选择与MinGW的集成:如果你只是做 C\C++ 的开发我建议你下载 Eclipse IDE for C/C++ Developers版本。

直接解压就可以使用了。

为了使CDT 能够取用 MinGW 来进行编译的工作 , 我们要回到 Eclipse 当中进行设定window -> perferences->C/C++->Make->New Make Project->New Builder找到Binary Parser 选择 PE Windows Parser 这样我们就成功构建了 Eclipse+CDT+MinGW 的 C/C++开发环境。

重新创建一个c++项目。

如果如果你环境变量设置正确的话就会在test 目录下出现 includes的库文件。

运行项目,如果能看到运行结果就已经OK了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档