C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

这篇博客介绍了C/C++的跨平台编译,重点讨论了POSIX标准及其在Linux、Windows上的应用。内容包括POSIX标准的定义和意义,Cygwin和MinGW作为跨平台编译工具的工作原理,以及静态库和动态库的编译与使用。此外,还提到了CodeBlocks这样的IDE在跨平台开发中的作用。
摘要由CSDN通过智能技术生成

0. 引言

UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够被授权使用的一个操作系统。linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打造的一个操作系统。为什么linux和unix之间有很多软件可以很轻松的移植?因为linux也满足POSIX规范,所以在运行机制上跟unix相近。同时,POSIX标准也是Linux、windows下能够进行交叉编译的基础

0x1: POSIX(Portable Operating System Interface)

可移植操作系统接口(Portable Operating System Interface POSIX),是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼应IEEE的要求而提议的一个易于记忆的名称。它基本上是(Portable Operating System Interface可移植操作系统接口)的缩写,而X则表明其对Unix API的传承

Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。微软的Windows NT声称部分实现了POSIX标准,因为有POSIX标准的存在,我们在unix、linux、windows上进行编程的时候,会发现有很多API都是通用的,虽然大多数情况下进行跨系统兼容编程是很困难的

当前的POSIX主要分为四个部分

1. Base Definitions
2. System Interfaces
3. Shell and Utilities
4. Rationale

0x2: POSIX 1.1标准

POSIX(Portable Operating System Interface for Computing Systems)是由IEEE 和ISO/IEC 开发的一簇标准。该标准是基于现有的UNIX实践和经验,描述了操作系统的调用服务接口,用于保证编制的应用程序可以在源代码一级上在多种操作系统上移植运行。

复制代码
1. 1003.0
管理POSIX开放式系统环境(OSE)。IEEE在1995年通过了这项标准。ISO的版本是ISO/IEC 14252:1996

2. 1003.1
被广泛接受、用于源代码级别的可移植性标准。1003.1提供一个操作系统的C语言应用编程接口(API)。IEEE和ISO已经在1990年通过了这个标准,IEEE在1995年重新修订了该标准。

3. 1003.1b
一个用于实时编程的标准(以前的P1003.4或POSIX.4)。这个标准在1993年被IEEE通过,被合并进ISO/IEC 9945-1

4. 1003.1c
一个用于线程(在一个程序中当前被执行的代码段)的标准。以前是P1993.4或POSIX.4的一部分,这个标准已经在1995年被IEEE通过,归入ISO/IEC 9945-1:1996

5. 1003.1g
一个关于协议独立接口的标准,该接口可以使一个应用程序通过网络与另一个应用程序通讯。1996年,IEEE通过了这个标准

6. 1003.2
一个应用于shell和工具软件的标准,它们分别是操作系统所必须提供的命令处理器和工具程序。1992年IEEE通过了这个标准。ISO也已经通过了这个标准(ISO/IEC 9945-2:1993)

7. 1003.2d
改进的1003.2标准

8. 1003.5
一个相当于1003.1的Ada语言的API。在1992年,IEEE通过了这个标准。并在1997年对其进行了修订。ISO也通过了该标准

9. 1003.5b
一个相当于1003.1b(实时扩展)的Ada语言的API。IEEE和ISO都已经通过了这个标准。ISO的标准是ISO/IEC 14519:1999

10. 1003.5c
一个相当于1003.1q(协议独立接口)的Ada语言的API。在1998年,IEEE通过了这个标准。ISO也通过了这个标准。

11. 1003.9
一个相当于1003.1的FORTRAN语言的API。在1992年,IEEE通过了这个标准,并于1997年对其再次确认。ISO也已经通过了这个标准

12. 1003.10
一个应用于超级计算应用环境框架(Application Environment Profile,AEP)的标准。在1995年,IEEE通过了这个标准

13. 1003.13
一个关于应用环境框架的标准,主要针对使用POSIX接口的实时应用程序。在1998年,IEEE通过了这个标准 

14. 1003.22
一个针对POSIX的关于安全性框架的指南

15. 1003.23
一个针对用户组织的指南,主要是为了指导用户开发和使用支持操作需求的开放式系统环境(OSE)框架

16. 2003
针对指定和使用是否符合POSIX标准的测试方法,有关其定义、一般需求和指导方针的一个标准。在1997年,IEEE通过了这个标准

17. 2003.1
这个标准规定了针对1003.1的POSIX测试方法的提供商要提供的一些条件。在1992年,IEEE通过了这个标准

18. 2003.2
一个定义了被用来检查与IEEE 1003.2(shell和工具API)是否符合的测试方法的标准。在1996年,IEEE通过了这个标准
复制代码

0x3: POSIX标准的意义

POSIX的意义在于提供了"跨操作系统兼容性编译"的能力,遵循了POSIX标准的C/C++程序源代码,可以直接在Linux/BSD环境下用GCC编译,或者在windows下用Cygwin/MinGW编译(Cygwin、MinGW提供了跨操作系统的兼容编译)。这叫跨操作系统的编译,注意要和"跨平台交叉编译"区分开来

Relevant Link:

http://zh.wikipedia.org/wiki/POSIX
http://i.linuxtoy.org/docs/guide/ch48s05.html

 

1. 交叉编译 

0x1: 交叉编译简介

从编译所在的平台和运行所在的平台这点来看,有两种编译概念

复制代码
1. 本地编译
我们常见的软件开发,都是属于"本地编译"。在当前的PC下,x86的CPU下,直接编译出来程序,可以运行的程序(或者库文件),其可以直接在当前的环境,即x86的CPU下,当前电脑中,运行。
此时的编译,可以叫做"本地编译",即在当前目标平台下,编译出来的程序,也只是放到当前平台下,就可以运行的

2. 交叉编译
这是一个和本地编译相对应的概念。而所谓的"交叉编译",就是在一种平台上编译,编译出来的程序,是放到别的平台上运行
即编译的环境,和运行的环境,不一样,属于交叉的,此所谓cross交叉编译,这个概念,主要和嵌入式开发有关
复制代码

一种最常见的例子就是:

在进行嵌入式开发时,手上有个嵌入式开发板,CPU是arm的,然后在x86的平台下开发,比如Ubuntu的Linux,或者是Win7。然后就需要在x86的平台上,(用交叉编译器)去编译你写好的程序代码,编译生成的(可执行的)程序,是放
到目标开发板,arm的CPU上运行的
此所谓:在x86平台上编译,在ARM平台上运行

交叉编译,英文常写作cross compile,也有其他写法:crosscompile, cross compiling等

0x2: 为何要有交叉编译

之所以要有交叉编译,主要原因是:

复制代码
1. 嵌入式系统中的资源太少
交叉编译出来的程序,所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译,最常见的情况是:
因为编译,开发,都需要相对比较多的CPU,内存,硬盘等资源,而嵌入式开发上的那点资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源,供你本地编译。所以需要在别的平台上进行跨平台编译,然后在其他的平台上运行
复制代码

0x3: 跨平台编译和跨操作系统编译的差别

这里需要注意的是"平台"的概念,实际上包含两个概念

1. 体系结构(Architecture): 同一个体系结构可以运行不同的操作系统
2. 操作系统(Operating System): 同一个操作系统也可以在不同的体系结构上运行

举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称

像crosstool-NG这类交叉编译器和Cygwin这类跨操作系统平台编译器的区别在于

1. crosstool-NG跨平台编译(跨体系结构、操作系统)

2. Cygwin跨平台编译(提供*inux到windows系统的代码级编译兼容性)

Relevant Link:

http://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html
http://zh.wikipedia.org/wiki/%E4%BA%A4%E5%8F%89%E7%B7%A8%E8%AD%AF%E5%99%A8
http://baike.baidu.com/view/650389.htm

 

2. Cygwin简介

0x1: 简介

Cygwin是许多自由软件的集合,最初由Cygnus Solutions开发,用于各种版本的Microsoft Windows上,运行类UNIX系统。Cygwin的主要目的是通过"重新编译"(注意:是重新编译),将POSIX系统(例如Linux、BSD,以及其他Unix系统)上的软件移植到Windows上。Cygwin移植工作在Windows NT上比较好,在Windows 95和Windows 98上,相对差劲一些。目前Cygwin由Red Hat等负责维护

首要需要明白的是,Cygwin不是一个跨平台模拟器,它不能让我们把linux上编译出来的程序在windows上运行(像wine那样),而是一个跨平台的编译器,也就是提供代码级的跨操作系统兼容性,我们在linux下写的符合POSIX标准的C程序可以在windows下面进行编译,Cygwin提供了一套在windows下可以使用的Linux的API

Cygwin包括了一套库,该库在Win32系统下实现了POSIX系统调用的API。还有一套GNU开发工具集(比如GCC、GDB),这样可以进行简单的软件开发。还有一些UNIX系统下的常见程序。2001年,新增了X Window System

0x2: Cygwin的特性

复制代码
Cygwin is:
1. a large collection of GNU and Open Source tools which provide functionality similar to a Linux distribution on Windows.
2. a DLL (cygwin1.dll) which provides substantial POSIX API functionality.

Cygwin is not:
1. a way to run native Linux apps on Windows. You must rebuild your application from source if you want it to run on Windows.
2. a way to magically make native Windows apps aware of UNIX® functionality like signals, ptys, etc. Again, you need to build your apps from source if you want to take advantage 
of Cygwin functionality.
复制代码

0x3: Cygwin原理

cygnus当初首先把GCC,GDB,GAS等开发工具进行了改进,使他们能够生成并解释win32的目标文件。然后,他们要把这些工具移植到windows平台上去。一种方案是基于win32 api对这些工具的源代码进行大幅修改,这样做显然需要大量工作。因此,他们采取了一种不同的方法

复制代码
1. 他们写了一个共享库(就是cygwin.dll),把win32 api中没有的unix风格的调用(如fork、spawn、signals、select、sockets等)封装在里面
2. 也就是说,他们基于win32 api写了一个unix系统库的模拟层(这个模拟层是一个关键,它的底层是win32 api,上层提供unix风格的调用,所以我们才可以在windows下编译unix风格的C程序)
3. 这样,只要把这些工具的源代码和这个共享库连接到一起,就可以使用unix主机上的交叉编译器来生成可以在windows平台上运行的工具集
4. 以这些移植到windows平台上的开发工具为基础,cygnus又逐步把其他的工具(几乎不需要对源代码进行修改,只需要修改他们的配置脚本)软件移植到windows上来。这样,在windows平台上运行bash和开发工具、用户工具,感觉好
像在unix上工作
复制代码

0x4: 使用Cygwin编程

code

复制代码
#iuclude <stdio.h>

main()
{
    printf("hello world!!\n");
}
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值