mingw命令行编译示例

如果你正在学习c++ cookbook,那这篇文章对你会很有帮助

在阅读本文之前,请先看这篇文章

http://blog.csdn.net/dcmilan/article/details/7983697

1.    准备工作

1.1创建3个文件夹

johnpaul, georgeringo, hellobeatles

1.2加入源文件

根据注释提示的目录创建源文件

// johnpaul/john.hpp

#ifndef JOHN_HPP_INCLUDED

#define JOHN_HPP_INCLUDED

 

void john( ); // Prints "John, "

 

#endif // JOHN_HPP_INCLUDED

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

// johnpaul/john.cpp

#include <iostream>

#include "john.hpp"

 

void john( )

{

   std::cout << "John, ";

}

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

// johnpaul/paul.hpp

#ifndef PAUL_HPP_INCLUDED

#define PAUL_HPP_INCLUDED

 

void paul( ); // Prints " Paul, "

 

#endif // PAUL_HPP_INCLUDED

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

// johnpaul/paul.cpp

#include <iostream>

#include "paul.hpp"

 

void paul( )

{

   std::cout << "Paul, ";

}

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

// johnpaul/johnpaul.hpp

#ifndef JOHNPAUL_HPP_INCLUDED

#define JOHNPAUL_HPP_INCLUDED

 

void johnpaul( ); // Prints "John, Paul, "

 

#endif // JOHNPAUL_HPP_INCLUDED

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

// johnpaul/johnpaul.cpp

 

#include "john.hpp"

#include "paul.hpp"

#include "johnpaul.hpp"

 

void johnpaul( )

{

   john( );

   paul( );

}

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

// georgeringo/george.hpp

#ifndef GEORGE_HPP_INCLUDED

#define GEORGE_HPP_INCLUDED

 

void george( ); // Prints "George, "

 

#endif // GEORGE_HPP_INCLUDED

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

// georgeringo/george.cpp

#include <iostream>

#include "george.hpp"

 

void george( )

{

   std::cout << "George, ";

}

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

// georgeringo/ringo.hpp

#ifndef RINGO_HPP_INCLUDED

#define RINGO_HPP_INCLUDED

 

void ringo( ); // Prints "and Ringo\n"

 

#endif // RINGO_HPP_INCLUDED

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

// georgeringo/ringo.cpp

#include <iostream>

#include "ringo.hpp"

 

void ringo( )

{

   std::cout << "and Ringo\n";

}

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

// georgeringo/georgeringo.hpp

#ifndef GEORGERINGO_HPP_INCLUDED

#define GEORGERINGO_HPP_INCLUDED

// define GEORGERINGO_DLL when building libgerogreringo.dll

# if defined(_WIN32) && !defined(__GNUC__)

# ifdef GEORGERINGO_DLL

# define GEORGERINGO_DECL _ _declspec(dllexport)

# else

# define GEORGERINGO_DECL _ _declspec(dllimport)

# endif

# endif // WIN32

#ifndef GEORGERINGO_DECL

# define GEORGERINGO_DECL

#endif

// Prints "George, and Ringo\n"

#ifdef __MWERKS__

# pragma export on

#endif

 

GEORGERINGO_DECL void georgeringo( );

 

#ifdef __MWERKS__

# pragma export off

#endif

#endif // GEORGERINGO_HPP_INCLUDED

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

// georgeringo/ georgeringo.cpp

#include "george.hpp"

#include "ringo.hpp"

#include "georgeringo.hpp"

 

void georgeringo( )

{

   george( );

   ringo( );

}

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

// hellobeatles/ hellobeatles.cpp

#include "../johnpaul/johnpaul.hpp"

#include "../georgeringo/georgeringo.hpp"

 

int main( )

{

   // Prints "John, Paul, George, and Ringo\n"

   johnpaul( );

   georgeringo( );

}



 

2.    生成目标文件

cmd下,进入每个cpp对应得目录运用g++命令

为每个cpp创建目标文件

命令格式:g++ -c –o john.o john.cpp或g++ -c john.cpp,这样就会默认生成与cpp同名的.o文件

一共有7cpp,对应生成7.o文件


3.    生成静态库

使用johnpaul文件夹中的文件生成静态库

命令格式为:ar ru libjohnpaul.a john.o paul.o johnpaul.o

生成的.a文件就是静态库

ar归档(archiver)的目的就是为了把多个.o文件打包,这样看起来更加清爽,也便于传播

4.    生成动态库

使用georgeringo文件夹中的文件生成动态库(dll)

命令格式为:g++ -shared –fPIC –o libgeorgeringo.so george.o ringo.o georgeringo.o

生成了一个.so文件,然后继续下面的命令(so代表shared object)

g++ -shared –o libgeorgeringo.dll Wl,--out-implib,libgeorgeringo.a –Wl,--export-all-symbols –Wl,--enable-auto-image-base george.o ringo.o georgeringo.o

这个生成的dll一会要放到生成的exe对应的文件夹里

5.    生成可执行文件

切换到hellobeatles文件夹

命令:g++ -o hellobeatles hellobeatles.o ../johnpaul/libjohnpaul.a ../georgeringo/libgeorgeringo.a

生成可执行文件hellobeatles.exe

georgeringo文件夹中的dll拷贝到可执行文件的目录下,然后运行显示

John, Paul, George, and Ringo

6.完整执行过程

Microsoft Windows [版本 6.1.7600]

版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

 

C:\Users\ztn>cd D:\Exercise\CookExample\Chap1\beatles\johnpaul

 

C:\Users\ztn>d:

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>dir /w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles\johnpaul的目录

 

[.]            [..]           john.cpp       john.hpp       johnpaul.cpp

johnpaul.hpp   paul.cpp       paul.hpp

               6 个文件            819字节

               2 个目录 117,802,258,432可用字节

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>g++ -c -o john.o john.cpp

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>g++ -c -o paul.o paul.cpp

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>g++ -c -o johnpaul.o johnpaul.cp

 

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>ar ru libjohnpaul.a john.o paul.

 johnpaul.o

ar: creating libjohnpaul.a

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>ranlib libjohnpaul.a

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>cd..

 

D:\Exercise\CookExample\Chap1\beatles>cd georgeringo

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles\georgeringo的目录

 

[.]               [..]              george.cpp        george.hpp

georgeringo.cpp   georgeringo.hpp   ringo.cpp         ringo.hpp

               6 个文件          1,356字节

               2 个目录 117,802,246,144可用字节

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>g++ -c -o george.o george.cpp

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>g++ -c -o ringo.o ringo.cpp

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>g++ -c -o georgeringo.o georg

ringo.cpp

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>g++ -shared -fPIC -o libgeorg

ringo.so george.o ringo.o georgeringo.o

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>g++ -shared -o libgeorgeringo

dll -Wl,--out-implib,libgeorgeringo.a -Wl,--export-all-symbols -Wl,--enable-aut

-image-base george.o ringo.o georgeringo.o

Creating library file: libgeorgeringo.a

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>cd..

 

D:\Exercise\CookExample\Chap1\beatles>cd hellobeatles

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles\hellobeatles的目录

 

[.]                [..]               hellobeatles.cpp

               1 个文件            213字节

               2 个目录 117,794,668,544可用字节

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>g++ -c -o hellobeatles.o hel

obeatles.cpp

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>g++ -o hellobeatles hellobea

les.o ../johnpaul/libjohnpaul.a ../georgeringo/libgeorgeringo.a

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>hellobeatles

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>cd..

 

D:\Exercise\CookExample\Chap1\beatles>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 D:\Exercise\CookExample\Chap1\beatles的目录

 

[.]            [..]           [binaries]     [georgeringo]  [hellobeatles]

[johnpaul]

               0 个文件              0字节

               6 个目录 117,790,896,128可用字节

 

D:\Exercise\CookExample\Chap1\beatles>cd georgeringo

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles\georgeringo的目录

 

[.]                  [..]                 george.cpp

george.hpp           george.o             georgeringo.cpp

georgeringo.hpp      georgeringo.o        libgeorgeringo.a

libgeorgeringo.dll   libgeorgeringo.so    ringo.cpp

ringo.hpp            ringo.o

              12 个文件      7,568,495字节

               2 个目录 117,790,896,128可用字节

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>cd..

 

D:\Exercise\CookExample\Chap1\beatles>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles的目录

 

[.]            [..]           [binaries]     [georgeringo]  [hellobeatles]

[johnpaul]

               0 个文件              0字节

               6 个目录 117,790,896,128可用字节

 

D:\Exercise\CookExample\Chap1\beatles>cd johnpaul

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles\johnpaul的目录

 

[.]            [..]           john.cpp       john.hpp       john.o

johnpaul.cpp   johnpaul.hpp   johnpaul.o     paul.cpp       paul.hpp

paul.o

               9 个文件          4,293字节

               2 个目录 117,790,896,128可用字节

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>ar ru libjohnpaul.a john.o paul.

 johnpaul.o

ar: creating libjohnpaul.a

 

D:\Exercise\CookExample\Chap1\beatles\johnpaul>cd..

 

D:\Exercise\CookExample\Chap1\beatles>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles的目录

 

[.]            [..]           [binaries]     [georgeringo]  [hellobeatles]

[johnpaul]

               0 个文件              0字节

               6 个目录 117,798,457,344可用字节

 

D:\Exercise\CookExample\Chap1\beatles>cd georgeringo

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles\georgeringo的目录

 

[.]               [..]              george.cpp        george.hpp

george.o          georgeringo.cpp   georgeringo.hpp   georgeringo.o

ringo.cpp         ringo.hpp         ringo.o

               9 个文件          4,851字节

               2 个目录 117,798,457,344可用字节

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>g++ -shared -fPIC -o libgeorg

ringo.so george.o ringo.o georgeringo.o

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>g++ -shared -o libgeorgeringo

dll -Wl,--out-implib,libgeorgeringo.a -Wl,--export-all-symbols -Wl,--enable-aut

-image-base george.o ringo.o georgeringo.o

Creating library file: libgeorgeringo.a

 

D:\Exercise\CookExample\Chap1\beatles\georgeringo>cd..

 

D:\Exercise\CookExample\Chap1\beatles>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles的目录

 

[.]            [..]           [binaries]     [georgeringo]  [hellobeatles]

[johnpaul]

               0 个文件              0字节

               6 个目录 117,794,660,352可用字节

 

D:\Exercise\CookExample\Chap1\beatles>cd hellobeatles

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>dir/w

 驱动器 D中的卷没有标签。

 卷的序列号是 73B6-6CE1

 

 D:\Exercise\CookExample\Chap1\beatles\hellobeatles的目录

 

[.]                [..]               hellobeatles.cpp   hellobeatles.o

               2 个文件            899字节

               2 个目录 117,794,660,352可用字节

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>g++ -o hellobeatles hellobea

les.o ../johnpaul/libjohnpaul.a ../georgeringo/libgeorgeringo.a

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>hellobeatles

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>hellobeatles

John, Paul, George, and Ringo

 

D:\Exercise\CookExample\Chap1\beatles\hellobeatles>

7. 补充:以mytime0为例(代码来自cpp primer plus 5th edition)

1.配置好gcc的环境变量之后,建立一个文件夹,里面有3个文件。

2.复制代码,点击下面的view plain按钮可以复制没有行号的代码
// mytime0.cpp  -- implementing Time methods
#include <iostream>
#include "mytime0.h"

Time::Time()
{
    hours = minutes = 0;
}

Time::Time(int h, int m )
{
    hours = h;
    minutes = m;
}

void Time::AddMin(int m)
{
    minutes += m;
    hours += minutes / 60;
    minutes %= 60;
}
void Time::AddHr(int h)
{
    hours += h;
}

void Time::Reset(int h, int m)
{
    hours = h;
    minutes = m;
}

Time Time::Sum(const Time & t) const
{
    Time sum;
    sum.minutes = minutes + t.minutes;
    sum.hours = hours + t.hours + sum.minutes / 60;
    sum.minutes %= 60;
    return sum;
}

void Time::Show() const
{
    std::cout << hours << " hours, " << minutes << " minutes";
}



// mytime0.h -- Time class before operator overloading
#ifndef MYTIME0_H_
#define MYTIME0_H_

class Time
{
private:
    int hours;
    int minutes;
public:
    Time();
    Time(int h, int m = 0);
    void AddMin(int m);
    void AddHr(int h);
    void Reset(int h = 0, int m = 0);
    Time Sum(const Time & t) const;
    void Show() const;
};
#endif


// usetime0.cpp -- using the first draft of the Time class
// compile usetime0.cpp and mytime0.cpp together
#include <iostream>
#include "mytime0.h"

int main()
{
    using std::cout;
    using std::endl;
    Time planning;
    Time coding(2, 40);
    Time fixing(5, 55);
	Time total;

    cout << "planning time = ";
    planning.Show();
    cout << endl;
 
    cout << "coding time = ";
    coding.Show();
    cout << endl;
    
    cout << "fixing time = ";
    fixing.Show();
    cout << endl;

    total = coding.Sum(fixing);
    cout << "coding.Sum(fixing) = ";
    total.Show();
    cout << endl;
   
    return 0;
}

3.进入CMD并切换到指定文件夹


4.将cpp编译成object文件,头文件会自动被调用,不用管他

   编译之后会生成两个.o文件


5.连接object文件生成exe。执行time命令就可以看到系统当前时间

   整个编译连接的过程非常繁琐,需要细致的键入命令和文件名



6.直接生成exe,只要这样一条命令也是可以的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值