Dev-Cpp/Mingw32环境下使用静态连接库和做自己的静态库

本文介绍了在Windows的Mingw32和Dev环境下使用静态连接库的方法,包括在VC和Mingw32中使用静态库的参数差异,以及在Dev中设置参数的步骤。还详细说明了制作静态链接库的过程,如编译代码、生成静态库、编写头文件等,并给出了使用示例。

From:http://blog.youkuaiyun.com/visioncat/(北斗星君的专栏)

修改:在第一段代码中加入#include “windows.h“

-------------------------------------在你的程序中使用静态连接库------------------------------------


  在Windows中也许各位都会熟悉以obj和lib结尾的文件。这些文件就是Win32下的二进制文件和静态连接库。但是在Mingw32下有些特殊,我原来在第一章介绍过的。他们是o和a。很奇怪吧。不过我们这里只要知道如何使用就可以了。关于更多的不在本文的范围内。
  我们先以VC为例,各位知道在VC中使用静态库,要在连接程序的时候选择导入的静态库。参数为静态库的全名。比如winmm.lib但是在Mingw32下有些不同。你所使用的参数为 -lwinmm这个就可以了。而-lwinmm的意思是导入静态链接库libwinmm.a。是不是有些想不通?下面我们来介绍一下在Dev中的使用和意义。
  首先我们启动Dev,新建一个工程。然后选择工程->工程属性。(如果你使用New Look图标,那么工程属性就是一个盾型图标。)然后,选择参数选项卡。在连接器的文本框中输入你要的参数,如-lwinmm。至于分割符,可以使用空格,也可以使用回车。不过我个人推荐回车。如果顺利,你的界面看起来会像下图。


  当然你如果要使用*.lib可以,只要将文件名直接填入就可以了。就像 winmm.lib。当然如果用绝对路径也可以。
  下面我们来看看静态连接库的格式。当然,我们不是从文件格式去分析,而是从调用格式看。通常静态库的文件名为 lib*.a其中*表示的就是任何字符。而在我们调用的时候,不需要将所有的文件名都用上,只需要使用*的内容就可以了。就像调用libwinmm.a的静态库我们只需要在连接的时候加参数 -lwinmm就可以了。前面的lib和后面的.a都不需要了。如果,还不太明白。可以看看dev安装目录中的lib目录。里面有很多win32下的静态连接库。自己分析一下文件名和调用方法就会很清楚了。
  最后我们实战一下静态连接库的使用。
  写什么好呢?写一个控制台上的音乐播放器吧。当然只是简单的播放音乐而已,而且路径不支持中文。这里只是为了熟悉一下静态库的使用。
  新建一个控制台工程,然后我们在main.c的代码中写如下代码。

 

//main.c
#include “windows.h“
#define MAX 255

int main(int argc, char *argv[])
{
    if (argc == 2)
    {
        char filename[MAX];
       
        strcpy(filename, "open ");
       
        strcat(filename, argv[1]);
       
        strcat(filename, " alias media");
       
        mciSendString("close media",0,0,0);

        mciSendString(filename,0,0,0);

        mciSendString("play media",0,0,0);

        system("pause");
    }
    else
    {
        printf("play.exe musicfilename");
    }

    return 0;

}
//main.c end

用法:main filename.wav

然后我们在工程属性的连接器参数中输入 -lwinmm 好了。开始编译。如果顺利,我们的程序就会编译成功。并且可以播放一些常用的音乐文件。高兴吧。

好了,这章我们就到这里用这个例子结束了。

问外音:
由于本人最近比较忙,所以原来的两章一文改成了一章一文。请原谅。下一章我们将介绍如何建立Mingw32的静态连接库。敬请期待。并且希望各位能够多提意见。因为不论是程序还是细想唯有通过不断的交流才能愈加完善。

------------------------------------制作自己的静态链接库------------------------------------------


  这是第八章,八这个数字很多人都喜欢。我也一样。(感觉好迷信啊。)这一章我们要来制作静态链接库,我相信各位一定会很高兴的。
  首先我先简单介绍一下静态链接库的作用。我们知道,C/C++程序生成目标代码的过程有,编写代码,编译代码,连接代码,生成目标代码。在连接代码的时候,会将编译后的二进制代码连接成目标代码。但是,有些时候。我们想让程序导入必要的代码,而不想导入无用的代码到我们的程序中。我们该如何呢?很简单,使用静态连接库。使用它我们就可以实现将在程序中使用的函数导入的目的。
  下面我们来一步步的学做静态链接库并且学会如何使用。
  我们现在先写一段代码,你可以用Dev也可以用记事本也可以用任何你喜欢的文本编辑器。像我就比较喜欢vi或者emacs作为平时的文本编辑器。话说远了,现在言规正传。我们写下下面的代码。

//HelloWorld.c

#include

void HelloWorld(void)
{
        printf("Hello World");
}

上面那段C代码各位应该很熟悉的吧,那么经典的Hello World好让我怀念啊。保存为HelloWorld.c以后我们就开始生成了。
首先,我们先编译HelloWorld.c

gcc -c HelloWorld.c -o HelloWorld.o

这样我们得到一个二进制的文件HelloWorld.o

接着我们生成静态库。

ar cqs libHelloWorld.a HelloWorld.o

这样我们党额静态链接库就好了。如果有需要可以将其他的二进制文件名加HelloWorld.o的后面将他们连接成一个静态链接库。另外,生成的静态库文件名必须为lib*.a

好了,现在我们来使用我们的库吧。

接下来,我们为了能够使用方便,写一个如下头文件。

//HelloWorld.h
void HelloWorld(void);

接着我们开始使用我们刚才生成的静态库。写一个main.c的文件。

//main.c

#include "HelloWorld.h"

int main(void)
{
        HelloWorld();
        return(0);
}

使用gcc编译,假设我们这里所有的文件都保存在同一个目录下。

gcc -c main.c -o main.o

然后我们连接程序。

gcc main.o -o main.exe -L"./" -lHelloWorld

如果顺利我们会得到一个main.exe的文件。

在控制台下输入main.exe或者main就可以出现 Hello World 这组单词。

看了上面的文章是否很兴奋想要生成自己的静态链接库?其实,我个人觉得mingw32生成静态链接库要比VC生成的简单。不知道你有没有这样的感觉。

当然,如果你要在Dev下使用静态连接库,也是可以的。方法我在上一章已经说过了。只是,如果你要使用自己的库必须设置路径。

只要在连接器参数中添加 -L"你的库的所在的文件夹" 或者 将你的库保存到Dev安装目录中的lib目录中。

好了,本文就介绍到这里。如果有什么问题,可以在这里留言。

问外音:


这篇文章其实我真的很喜欢,不是文章喜欢,而是内容很喜欢。不知道各位如何想。这里介绍了一个生成静态库的方法,感觉比VC生成的要简单。其实在gcc的Linux平台下生成动态连接库还要比VC下生成不知道要简单多少倍了。如果说Win32中用于开发最好的平台是win2000那么,在那么x86系统中用于开发的平台莫过于Linux了。这章的内容也许对许多的程序员都有些陌生,我实在担心各位会在实践中会碰到问题,所以在这里还是希望各位在遇到困难时多到这里提问。最后还是我的一句名言:不论是程序还是思想唯有通过不断的交流才能愈加完善。(看过《古畑任三郎》么?主角总喜欢在发表观点后,说一句:我是古畑任三郎。感觉我也和他一样了。不过,这的确是一部不错的影片。至少比国内许多侦探片都好,没有额外的剧情,没有你你我我的爱情。纯粹是从一个破案的角度来拍摄的。推荐各位看看。)

# Project: 项目3 # Makefile created by Dev-C++ 5.11 CPP = g++.exe CC = gcc.exe WINDRES = windres.exe OBJ = D:/新建文件夹/test/三元运算符训练.o D:/新建文件夹/test/未命名6.o LINKOBJ = D:/新建文件夹/test/三元运算符训练.o D:/新建文件夹/test/未命名6.o LIBS = -L"D:/新建文件夹/Dev-Cpp/MinGW64/lib" -L"D:/新建文件夹/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc INCS = -I"D:/新建文件夹/Dev-Cpp/MinGW64/include" -I"D:/新建文件夹/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/新建文件夹/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" CXXINCS = -I"D:/新建文件夹/Dev-Cpp/MinGW64/include" -I"D:/新建文件夹/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/新建文件夹/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"D:/新建文件夹/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++" BIN = 项目3.exe CXXFLAGS = $(CXXINCS) -std=gnu99 CFLAGS = $(INCS) -std=gnu99 RM = rm.exe -f .PHONY: all all-before all-after clean clean-custom all: all-before $(BIN) all-after clean: clean-custom ${RM} $(OBJ) $(BIN) $(BIN): $(OBJ) $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) D:/新建文件夹/test/三元运算符训练.o: D:/新建文件夹/test/三元运算符训练.c $(CPP) -c D:/新建文件夹/test/三元运算符训练.c -o D:/新建文件夹/test/三元运算符训练.o $(CXXFLAGS) D:/新建文件夹/test/未命名6.o: D:/新建文件夹/test/未命名6.c $(CPP) -c D:/新建文件夹/test/未命名6.c -o D:/新建文件夹/test/未命名6.o $(CXXFLAGS)
11-19
编译单个文件... -------- - 文件名: D:\题目\未命名1.cpp - 编译器名: TDM-GCC 4.9.2 64-bit Release 处理 C++ 源文件... -------- - C++ 编译器: D:\Program Files (x86)\Dev-Cpp\MinGW64\bin\g++.exe - 命令: g++.exe "D:\题目\未命名1.cpp" -o "D:\题目\未命名1.exe" -g3 -g3 -I"D:\Program Files (x86)\Dev-Cpp\MinGW64\include" -I"D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"D:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include" -I"D:\Program Files (x86)\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.9.2\include\c++" -L"D:\Program Files (x86)\Dev-Cpp\MinGW64\lib" -L"D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc -g3 D:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o: In function `__tmainCRTStartup': C:/crossdev/src/mingw-w64-v3-git/mingw-w64-crt/crt/crtexe.c:254:(.text+0x1fe): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_Sleep' defined in .idata$5 section in D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libkernel32.a(dgnms01196.o) C:/crossdev/src/mingw-w64-v3-git/mingw-w64-crt/crt/crtexe.c:281:(.text+0x286): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_SetUnhandledExceptionFilter' defined in .idata$5 section in D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libkernel32.a(dgnms01183.o) C:/crossdev/src/mingw-w64-v3-git/mingw-w64-crt/crt/crtexe.c:289:(.text+0x2b4): relocation truncated to fit: R_X86_64_PC32 against symbol `__mingw_winmain_hInstance' defined in COMMON section in D:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/crossdev/src/mingw-w64-v3-git/mingw-w64-crt/crt/crtexe.c:315:(.text+0x313): relocation truncated to fit: R_X86_64_PC32 against symbol `__mingw_winmain_lpCmdLine' defined in COMMON section in D:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o C:/crossdev/src/mingw-w64-v3-git/mingw-w64-crt/crt/crtexe.c:241:(.text+0x495): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp_GetStartupInfoA' defined in .idata$5 section in D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libkernel32.a(dgnms00627.o) D:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2\libstdc++.a(ios_init.o):ios_init.cc:(.text$_ZNSt8ios_base4InitC2Ev+0x3c): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp___iob_func' defined in .idata$5 section in D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00083.o) D:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2\libstdc++.a(ios_init.o):ios_init.cc:(.text$_ZNSt8ios_base15sync_with_stdioEb+0xc0): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp___iob_func' defined in .idata$5 section in D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00083.o) D:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2\libstdc++.a(basic_file.o):basic_file.cc:(.text$_ZN12_GLOBAL__N_1L6xwriteEiPKcx+0xd): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp__errno' defined in .idata$5 section in D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00203.o) D:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2\libstdc++.a(basic_file.o):basic_file.cc:(.text$_ZNSt12__basic_fileIcE8sys_openEP6_iobufSt13_Ios_Openmode+0x1b): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp__errno' defined in .idata$5 section in D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00203.o) D:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2\libstdc++.a(basic_file.o):basic_file.cc:(.text$_ZNSt12__basic_fileIcE5closeEv+0x33): relocation truncated to fit: R_X86_64_PC32 against symbol `__imp__errno' defined in .idata$5 section in D:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib/libmsvcrt.a(dgrds00203.o) D:/Program Files (x86)/Dev-Cpp/MinGW64/bin/../lib/gcc/x86_64-w64-mingw32/4.9.2\libstdc++.a(basic_file.o):basic_file.cc:(.text$_ZNSt12__basic_fileIcE6xsgetnEPcx+0xd): additional relocation overflows omitted from the output collect2.exe: error: ld returned 1 exit status 编译结果... -------- - 错误: 1 - 警告: 0 - 编译时间: 1.66s
最新发布
11-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值