win gcc,g++ 用法总结

slef:  直接写个  .bat文件 (windows下)
content:
  goto skip_comments
  rem echo %1    //print  second argument

  添加动态链接库文件 msvcr120d.dll 到编译
  1.先加入了-LF:\wincode\ege\JuanYueYinYue   -L[path] , 要不然会找不到 msvcr120d.dll 链接库文件, 因为没有去 那个目录下找呗
  2.加入 -lmsvcr120d  表示链接 msvcr120d.dll  , 其实在本程序 链接该库文件 根本没用, 呵呵
  :skip_comments
  g++ %1 resource.h -lgraphics -lgdi32 -limm32 -lmsimg32 -lole32 -loleaut32 -lwinmm -luuid  -LF:\wincode\ege\JuanYueYinYue -lmsvcr120d -mwindows  

1.windows下gcc(mingw32)编译连接 GTK+ && MySQL


下载LOFTER客户端
1.下载MySQL(http://www.mysql.com/downloads/mysql/)
    安装 注意把 Client C API library 选项勾上,安装的是C语言API的库文件


2.下载GTK+(all-in-one bundles)(http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip)
   解压到任意目录
   把<安装目录>/bin 添加到环境变量 PATH
   打开cmd,输入:gtk-demo 测试OK

3.下载mingw(http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/mingw-get-inst-20120426/mingw-get-inst-20120426.exe/download)
   安装(下载速度奇慢!)
   把<安装目录>/bin 添加到环境变量 PATH
   打开cmd,输入:gcc -v 测试OK

4.gcc编译参数
    mysql参数:
        -I<安装目录>/include      表示搜索头文件的目录,注意:是大写的i
        -L<安装目录>/lib             表示搜索库文件的目录(网上有说是xxx/lib/debug,或许是因为版本不同,我那个目录里没有libmysql.lib)
        -llibmysql                         表示需要的库文件名为libmysql.lib(在LInux下是-lmysqlclient,表示的是libmysqlclient.so文件,把前面的lib三个字母省略了,这和win下的gcc有点不一样,win的gcc需要加lib,否则会提示找不到文件),注意:是小写的L表示

    gtk+参数:
        打开cmd,输入:pkg-config --cflags --libs gtk+-2.0,将显示内容保存(因为Linux下可以直接用``进行命令引用,但是我没学过bat脚本,不知道用什么符号--总之不是``...索性全复制出来)

     最后在cmd下用gcc编译时 把上面两列参数都加上吧windows下gcc(mingw32)编译连接 GTK+  MySQL - ke_nux - 编程为了生活,生活为了编程,最好是写个makefile文件,注意:用mingw的make要把<mingw安装目录>/bin下的mingw32-make.exe改成make.exe,否则cmd说找不到命令.

5.注意:
    (1)c源文件要加上:
        #inlcude <winsock.h>
        网上有说要加: #pragma comment(lib, "libmysql.lib") 但那是在VC上,gcc不是这样用的,会提示:"warning: ignoring #pragma comment" .其实加参数 -libmysql是一样的效果.不过不知用gcc怎么在c源码中直接关联.
    (2)运行生成的exe文件时要把<mysql安装目录>/lib/libmysql.dll拷到当前文件(就是可执行文件所在的目录),或者你索性拷去c:\windows\system32(64位的拷去c:\windows\system !!! 32位的拷到c:\windows\system也没什么问题),就跟玩游戏少dx的dll动态链接库文件一样哈windows下gcc(mingw32)编译连接 GTK+  MySQL - ke_nux - 编程为了生活,生活为了编程
    (3)若是64位的win7不建议装64位的mysql...要是你不信可以试一下,会跟我一样死的很惨的...不过折腾了两天还是把问题解决了哈,就是32位编译器和64位库文件的关系,还有32位的可执行文件和64位的动态链接库文件之间的关系,其实用32位的替换一下就行喽...

2.gcc, g++ 用法

简单的GCC用法
总的来说,gcc应该是一个编译器。但整套的gcc环境并不是由gcc构成的,它是由多个包所组成的,这些包的互相作用产生了gcc的开发环境。其中,有一些包是你开发应用程序所必备的基本包,离开这些包你将无法正常使用gcc。

    gcc开发环境包括如下几大包:

    binary                         基本包   提供基本的汇编器,连接器等
    gcc                            基本包   各种语言的编译器,包括C,C++,Ada,Java等 
    Win32api,mingwi-runtime/glibc  基本包   系统函数库 
    make/automake                  需要包   管理项目编译的程序 
    gdb                            附加包   调试程序 

一. 常用编译命令选项 
假设源程序文件名为test.c1. 无选项编译链接 
用法:#gcc test.c 
作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。编译成功后可以看到生成了一个a.out的文件。在命令行输入./a.out 执行程序。./表示在当前目录,a.out为可执行程序文件名。

2. 选项 -o 
用法:#gcc test.c -o test 
作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。输入./test执行程序。

3. 选项 -E <大写,注意>
用法:#gcc -E test.c -o test.i
作用:将test.c预处理输出test.i文件。

4. 选项 -S <大写,注意>
用法:#gcc -S test.i 
作用:将预处理输出文件test.i汇编成test.s文件。

5. 选项 -c 
用法:#gcc -c test.s 
作用:将汇编输出文件test.s编译输出test.o文件。

6. 无选项链接 
用法:#gcc test.o -o test 
作用:将编译输出文件test.o链接成最终可执行文件test。输入./test执行程序。

7. 选项-O 
用法:#gcc -O1 test.c -o test 
作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。输入./test执行程序。

二. 多源文件的编译方法

如果有多个源文件,基本上有两种编译方法: 
[假设有两个源文件为test.c和testfun.c]

1. 多个文件一起编译 
用法:#gcc testfun.c test.c -o test 
作用:将testfun.c和test.c分别编译后链接成test可执行文件。 
2. 分别编译各个源文件,之后对编译后输出的目标文件链接。 
用法: 
#gcc -c testfun.c //将testfun.c编译成testfun.o 
#gcc -c test.c //将test.c编译成test.o 
#gcc  testfun.o test.o -o test //将testfun.o和test.o链接成test

以上两种方法相比较,第一中方法编译时需要所有文件重新编译,而第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译。

三. gcc的常用编译参数

    同VC,TC等编译器不同,gcc其实是可以很方便的在提示符下编译程序的。gcc在提示符下编译程序,并没有如同VC那样的冗长而晦涩的编译参数。相反,却有着比VC更灵活且简短的参数。

    不得不承认,不懂gcc编译参数的人,确实会损失一些gcc的强大功能。所以,我下面简单介绍一下gcc的一些基本编译参数。这里,我以C编译器为例。

    注意:gcc的编译参数是区分大小写的。 

    编译二进制代码 
    gcc -c yours.c -o yours.o 
    使用这段指令,gcc将会把yours.c编译成yours.o的二进制代码。其中,yours.o就类似于VC,TC中的.obj文档。


    编译最简单的小程序 
    gcc -o yours yours.c 
    通过这条指令,gcc将会把yours.c源代码编译成名为yours的可执行程序。当然,您也可以将yours.c改成我们刚才介绍的yours.o文件。这样,gcc将使用编译刚才编译好的二进制文档来链接程序。这里,格式的特点是,-o 后面是一串文件列表,第一个参数是所编译程序的文件名,从第二个开始,就是您编译和连接该可执行程序所需要的二进制文档或者源代码。


    编译时将自己的头文件目录设为默认头文件目录 
    gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o 
    这条指令中的-I参数将会把Your_Include_Files_Document_Path添加到你默认的头文件目录中。这样您将可以使用 #include <your_include.h>来导入头文件。


    编译时使用自己的静态库存放目录 
    gcc -L”Your_Lib_Files_Document_Path” -o yours yours.o 
    这条指令将会让gcc在连接时除了在默认Lib存放目录中搜索指定的静态库以外,还会在Your_Lib_Files_Document_Path中搜索。


    编译时使用静态连接库 
    gcc -lyour_lib -o yours yours.o 
    这条指令将会让gcc在连接时把 libyour_lib.a中您所用到的函数连接到可执行程序中。此处注意,gcc所使用的静态连接库是lib*.a格式的。在连接时,只且仅需要提供*的内容就可以了。


    编译时使用优化 
    gcc -O2 -c yours.c -o yours.o 
    使用优化方式编译程序,其中除了-O2以外,还有-O3 -O1等等。他们代表不同的优化等级。最常用的,是-O2优化。当然,还有针对特殊CPU的优化,这里就不介绍了。


    编译时显示所有错误和警告信息 
    gcc -Wall -c yours.c -o yours.o 
    gcc在默认情况下,将对一些如变量申请未使用这样的问题或者申请了没有给予初始值的问题忽略。但是,如果使用了-Wall参数,编辑器将列出所有的警告信息。这样,您就可以知道您的代码中有多少可能会在其他操作系统下出错的地方了。(用这个指令看看你的代码有多少地方写的不怎么合适。)


    编译连接时,加入调试代码 
    gcc -g -o yours yours.c 
    正如同VC有debug编译模式一样,gcc也有debug模式。添加了-g 参数编译的可执行程序比普通程序略为大一些,其中添加了一些调试代码。这些代码将被gdb所支持。


    连接时缩小代码体积 
    gcc -s -o yours yours.o 
    因为有人说Visual-MinGW生成的代码小,于是研究了一下它的编译参数,发现release模式的编译参数就加了这一项。貌似编译后的代码的确缩小了很多。

    反汇编 
    gcc -S yours.c 
    用这个指令能把C语言变成汇编语言,不过不是常见的Intel语法,而是AT&T语法。两者的语法有很大的区别。


    获得帮助 
    gcc --help 
    这条指令从意思上就能看出,获得gcc的帮助信息。如果您有什么特殊需要,也许这个指令能帮上点小忙。


    总结:

    gcc的编译参数是可以组合起来的,如:

    gcc yours.c -o yours -Wall -s -O2

------------------------------------------------------------------------------

MinGW搭建开发环境 
    MinGW是Minimalistic GNU for Windows 的缩写。它是一个建立在GCC和binutils 项目上的编译器系统。和其他GCC的移植版相比,它可以说是最接近Win32的一个了。因为,MinGW几乎支持所有的Win32 API,这也是MinGW的特色之一。它所连接的程序,不需要任何第三方库就可以运行了。在某种程度上看,MinGW更像是VC的替代品。

    MinGW可以从http://www.mingw.org上获得。

    要安装MinGW有两种方案:

    第一种方案:手动安装

    到http://sourceforge.net/project/下载以下几个压缩包。考虑到文件的更新,此处只写出文件的主要部分,省去文件的版本和更新日期(注:带有src表示源代码)。

    gcc-core:C语言编译器,推荐使用最新的。 
    gcc-g++:C++语言编译器,版本同上。(可选) 
    binutils:MinGW的汇编器和连接器等基础工具。 
    mingw32-make:Make工具,用以管理你的项目。 
    gdb:MinGW调试器。 
    win32api:win32的API函数头文件和连接库 
    mingw-runtime:MinGW的运行时库

    把以上的压缩包解压到一个目录中,如C:\MinGW。

    注:MinGW还包括一个MSYM(Minimal SYStem)。这个工具是用来模仿Unix Shell,它可以把Unix上的命令转换成Windows命令,如果习惯Unix可以下载这个工具。

    把MinGW的目录 C:\MinGW\bin 添加进%PATH%环境变量中,可以在系统属性那里永久设置,或者建一个bat文件,写入以下字符: 
    set Path=%PATH%;C:\MinGW\bin 
    然后进入DOS运行这个bat文件即可。

    最后在MS-DOS环境下运行: 
    gcc -v 
    如果显示一段GCC的版本信息,说明你安装的MinGW能正常工作了。 

    第二种方案:自动安装

    到http://sourceforge.net/project/下载MinGW-x.x.x.exe。安装过程它会自动从网上下载相应的文件,并自动配置好环境。

------------------------------------------------------------------------------

MinGW的使用
这部分将给出MinGW 下gcc/g++开发程序详细例子。在讨论例子使用之前,我们需要对MinGW安装后的结果做个小小的改动。进入MinGW 的安装目录,如C:\MinGW,找到bin 目录下mingw32-make.exe,将其更名为make.exe(完成该改动后可以直接使用make来操作makefile)。
这里开始正式讨论MinGW的使用,分为5 个步骤:(假设在D:\project 下开发,后续本节中文件建立均在该目录下操作)
本节将会分别创建三个文件:cmnd.bat, makefile, main.cpp。

第一步建立 MinGW的gcc/g++的自动搜索路径BAT 文件
创建一个文本文件,输入以下方框内的内容:
set path=C:\mingw\bin;%PATH%;
cmd
保存好后,把文件名字改为:cmnd.bat

第二步创建makefile
创建一个文本文件,输入以下方框内的内容(可从本文中拷贝粘贴):
# makefile for MinGW Hello World Test
# @copyright 2007/05/01 by zenf
CC = g++
AR = ar
LD = ld
RM = del
#RM = rm -rf
MV = MOVE /Y
CP = copy
C++FLAGS = -g -Wno-deprecated -Wall -Werror -I.
OBJ_LIST = $(subst .cpp,.o,$(wildcard *.cpp))
TARGET = main.exe
all: depend.dep $(TARGET)
$(TARGET): $(OBJ_LIST)
$(CC) -o $(TARGET) $(OBJ_LIST) -mconsole
main.exe
clean:
$(RM) *.o *.obj *.tmp *.exe *.dep *.s
depend.dep:
$(CC) -M $(C++FLAGS) $(wildcard *.cpp) > $@
-include depend.*
.cpp.o :
$(CXX) -c $(C++FLAGS) $<
%.dir:%
$(MAKE) -C $< $(DEBUG_MAKE)
保存好后,把文件名字改为: makefile (注:没有后缀)

第三步建立 main.cpp
创建一个文本文件,输入以下方框内的内容:
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
cout << "hello world"<<endl;
cout << "----------------------------" << endl;
cout << "filename=" << __FILE__ << " line="<< __LINE__ << endl;
cout << "time="<< __TIME__ << " date="<< __DATE__ << endl;
cout << "funname="<< __func__ << endl;
cout << "----------------------------" << endl;
return 0;
}
保存好后,把文件名字改为: main.cpp
说明:main.cpp示例中的__FILE__, __LINE__, __func__等几个宏,对嵌入式软件开发的debug非常帮助。

第四步编译运行console模式
双击第一步中建立的cmnd.bat,进入command模式,输入make 回车,make自动调用makefile编译main.cpp,并且自动运行编译后的结果main.exe,输出如下结果:
D:\project >make
g++ -c -g -Wno-deprecated -Wall -Werror -I. main.cpp
g++ -o main.exe main.o -mconsole
main.exe
hello world
----------------------------
filename=main.cpp line=17
time=11:19:23 date=May 1 2007
funname=main
----------------------------

第五步编译运行windows 模式
编辑main.cpp,修改为如下的代码内容:
#include <windows.h>
intWINAPI WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
MessageBox (NULL, "Hello World, My Dear", "Hello Demo", MB_OK);
return (0);
}
同时把第二步骤的makefile 一行内容修正(把-mconsole改为-mwindows)
$(CC) -o $(TARGET) $(OBJ_LIST) –mconsole
修改为:
$(CC) -o $(TARGET) $(OBJ_LIST) –mwindows
运行make 如同第四步。

详细的MinGW的说明和使用,参考http://www.mingw.org/docs.shtml
  1. gcc 编译 dll 库文件
这两天用CB(Code::Blocks)写个小程序,要编译出DLL供VB(6)使用。CB使用mingw-gcc作为编译器,在库文件的产出上跟VC、VS之类的IDE略有不同。

由于C语言的基础知识不是太好,尤其对编译环节更是知之甚少。结果,试了几次,导出的DLL中的函数总是无法被调用。

用VB加载时总是提示"DLL调用约定错误",百度之了解到VB只能调用适配__stdcall约定(这也是其他语言也能调用C的默认方式)的函数。

于是在源文件中的函数前加上__stdcall,导出后又提示"找不到DLL入口点foo in mydll.dll",搜索得知可能是导出函数的名字有问题。

打开DLL Export Viewer,载入mydll.dll,发现函数变成了"foo@4"。

网上的说法是使用__stdcall的副作用,可以用extern "C"来避免,于是又加上extern "C",结果依旧。

还有人说可以用DEF文件来控制导出的函数名,不过我也没查到具体该怎么加入到编译过程中。

不断google&baidu之后,发现gcc可以在链接阶段通过指定--kill-at参数来消除这种情况。于是,紧接着又了解了下gcc的使用方法,尝试几次后终于成功了。

在这不得不吐槽部分人写的技术博客,很多问题就是只言片语带过,让人看得云里雾里。我觉得人可以说错话,但是起码要把自己的意思表达清楚,不然胡乱凑出一篇误人误己。

这里编写个简单例子来说明下具体是如何操作的:

建立DLL项目,结构如下:

test/
----mydll.h
----mydll.c
头文件:mydll.h

#ifndef __MYDLL_H__
#define __MYDLL_H__

#ifdef BUILD_DLL
  #define DLL_EXPORT __declspec(dllexport)
#else
  #define DLL_EXPORT __declspec(dllimport)
#endif

#ifdef __cplusplus
extern "C" {
#endif
  DLL_EXPORT int __stdcall foo(int x);
#ifdef __cplusplus
}
#endif

#endif // __MYDLL_H__
C文件:mydll.c

#include "mydll.h"

DLL_EXPORT int __stdcall foo(int x) {
    return x;
}
如果你安装了Code::Blocks(和MinGW),那么创建环境变量:

MINGW_HOME=C:\Program Files\CodeBlocks\MinGW
PATH=%MINGW_HOME%\bin;%PATH%
打开命令行,进入我们的项目路径中:

d:\test>
#执行编译命令
d:\test>mingw32-gcc -c -DBUILD_DLL mydll.c
#执行链接命令,生成mydll.dll和静态库文件libmydll.a
d:\test>mingw32-gcc -shared -o mydll.dll mydll.o -Wl,--kill-at,--out-implib,libmydll.a
Creating library file: libmydll.a
以上,就是我们生成DLL的全过程了。

接下来,打开VB我们来验证下:

Private Declare Function foo Lib "d:\test\mydll.dll" (ByVal x As Integer) As Integer

Private Sub Form_Load()
    Debug.Print foo(10)
End Sub
运行OK,立即窗口输出10。

用Python测试下:

>>> import ctypes
>>> mydll = ctypes.windll.LoadLibrary("d:\\test\\mydll.dll")
>>> print mydll.foo(10)
10
>>>
好,也没问题,那么证明结果上是正确的。

当然,由于本人水平较低,文章中肯定有描述不正确的地方,各位大神如果如果看到还请不吝指教。

参考文档:

http://baike.baidu.com/view/2814224.htm

http://baike.baidu.com/view/1276580.htm?fr=aladdin

http://blog.sina.com.cn/s/blog_4b02b8d001000avi.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值