首页 > 其他分享 >使用git-bash 进入MINGW64使用mingw32-make编译提示目录前面有个“/cygdrive/d”如何解决

使用git-bash 进入MINGW64使用mingw32-make编译提示目录前面有个“/cygdrive/d”如何解决

时间:2024-08-06 10:43:13浏览次数:15  
标签:git cygdrive mingw32 Windows 编译 调用 Cygwin MingW Linux

问题出现的根本原因使用绝对路径时,

export BUILD_ROOT = 'D:/XX/XX'

注意不能使用单引号直接地址export BUILD_ROOT = D:/XX/XX

 

刚刚接触 Cygwin ,头一个问题就是:Cygwin 如何访问 Windows 的各个磁盘目录,以及在 Windows 平台下如何访问 Cygwin 中的目录。

执行 mount 命令后可以看到 Windows 下的盘符被映射到 /cygdrive 特殊目录下。

  1. $ mount  
  2. C:/cygwin/bin on /usr/bin type ntfs (binary,auto)  
  3. C:/cygwin/lib on /usr/lib type ntfs (binary,auto)  
  4. C:/cygwin on / type ntfs (binary,auto)  
  5. C: on /cygdrive/c type ntfs (binary,posix=0,user,noumount,auto)  
  6. D: on /cygdrive/d type ntfs (binary,posix=0,user,noumount,auto) 

也就是说,在 Cygwin 中以路径 /cygdrive/c/Windows来访问Windows 下的 C:\Windows 目录。实际上, Cygwin 提供 cygpath 命令来实现 Windows 平台和 Cygwin 之间目录名称的变换,如下所示:

  1. $ cygpath -u C:\\Windows  
  2. /cygdrive/c/Windows  
  3.  
  4. $ cygpath -w ~/  
  5. C:\cygwin\home\jiangxin\ 

从上面的示例也可以看出,Cygwin 下的用户主目录(即 /home/jiangxin/ )相当于 Windows 下的 C:\cygwin\home\jiangxin\ 目录。

转自 http://book.51cto.com/art/201107/278828.htm

 

3.MinGW与Cygwin:原理与比较

MingW 与 Cygwin

首先 MinGW 和 Cygwin 都可以用来跨平台开发。

MinGW 是 Minimalistic GNU for Windows 的缩写,也就是 Win 版的 GCC。

Cygwin 则是全面模拟了Linux的接口,提供给运行在它上面的的程序使用,并提供了大量现成的软件,更像是一个平台。

相对的 MingW 也有一个叫 MSys(Minimal SYStem)的子项目,主要是提供了一个模拟 Linux 的 Shell 和一些基本的 Linux 工具。因为编译一个大型程序,光靠一个 GCC 是不够的,还需要有 Autoconf 等工具来配置项目,所以一般在 Windows 下编译 ffmpeg 等 Linux 下的大型项目都是通过Msys 来完成的,当然 Msys 只是一个辅助环境,根本的工作还是 MingW 来做的。

基本原理
  • 修改编译器,让 Window 下的编译器把诸如 fork 的调用翻译成等价的形式,这就是 MingW 的做法.
  • 修改库,让 Window 提供一个类似 UNIX 提供的库,他们对程序的接口如同 UNIX 一样,而这些库,当然是由 win32 的 API 实现的,这就是 Cygwin 的做法.
用 MingW 和 Cygwin 编译出来的程序的区别

首先 MingW 和 Cygwin 都不能让 Linux 下的程序直接运行在 Windows 上,必需通过源代码重新编译。

现代操作系统包括 Windows 和 Linux 的基本设计概念像进程线程地址空间虚拟内存这些都是大同小异的,之所以二者上的程序不能兼容,主要是它们对这些功能具体实现上的差异,首先是可执行文件的格式,Window 使用 PE 的格式,并且要求以 .EXE 为后缀名。Linux 则使用 Elf。其次操作系统的 API 也不一样,如 Windows 用 CreateProcess() 创建进程,而 Linux 使用 fork()

所以要移植程序必然要在这些地方进行改变,MingW 有专门的 W32api 头文件,来把代码中 Linux 方式的系统调用替换为对应的 Windows 方式。而 Cygwin 则通过 cygwin1.dll 这个文件来实现这种 API 的转换,并模拟一个 Linux 系统调用接口给程序,程序依然以 Linux 的方式调用系统 API,只不过这个 API 在 cygwin1.dll 上,cygwin1.dll 再调用 Windows 对应的实现,来把结果返回给程序。

可以用查看他们编译好的程序的导入表来验证这点。

二者生成的程序都是能在 Windows 上运行的 EXE 文件,显然都是 PE 格式,用一个PE格式查看工具检查一下就能发现,Cygwin 生成的程序依然有 fork() 这样的 Linux 系统调用,但目标库是 cygwin1。而 MingW 生成的程序,则全部使用从 KERNEL32 导出的标准 Windows 系统 API。

这样看来用 MingW 编译的程序性能会高一点,而且也不用带着那个接近两兆的 cygwin1.dll 文件。

但 Cygwin 对 Linux 的模拟比较完整,甚至有一个 Cygwin X 的项目,可以直接用 Cygwin 跑 X。

另外 Cygwin 可以设置 -mno-cygwin 的 flag,来使用 MingW 编译。

而与 Cygwin 更有可比性的 MSys 上的工具也是通过 Cygwin 这种模拟的方式来提供的。

总之这两个项目有千丝万缕的关系,一个不恰当的比方,如果 Mingw 是 MFC,Cygwin 就是 .NET 了。

4.Windows平台上使用MinGW编译Linux程序

1.下载安装mingw32
2.将mingw下bin和msys\1.0下bin设置为系统path
3.启动msys.bat
4.cd到项目目录
5.输入./configure
6.输入make
7.输入make install
8.cd C:\MinGW\msys\1.0\local\lib
9.ar x ***.a
10.ar r ***.lib *.o
即生成***.lib,头文件在C:\MinGW\msys\1.0\local\include
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5.Windows上调用MinGW编译的函数库

静态库函数

静态库扩展名一般是.lib(windows上)或.a(linux上),他和动态库(dll)是有区别的。调用静态库编译后会写入执行程序中。然后就可以独立运行了。动态库旨在动态调用,调用的时候需要加载dll才能正常工作(所以动态库往往可以提供补丁,或功能升级的时候使用,但是运行的速度有待商协)。另外,两个库的编译器也不一样,例如mingw用g++生成动态库*.dll, 用ar生成静态库*.a;而VC则一律用link.exe生成生成动态和静态库,用options来区别生成哪种。
示例

下面把若干的C++和C文件在MinGW上编译成一个静态库函数文件,然后在Windows上调用这个库函数。

假设我们有两个库函数文件myf1.cpp和myf2.c

//myf1.cpp
#include <stdio.h>
void f1_Fonction1(int a, double b, char *c)
{
    printf("调用文件myf1.cpp的f1_Fonction1成功\n");
}
int f1_Fonction2(int c)
{
    printf("调用文件myf1.cpp的f1_Fonction2成功\n");
    return c+1;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
//myf2.c
#include <stdio.h>
void f2_Fonction1(void)
{
    printf("调用文件myf2.c的f2_Fonction1成功\n");
}
int f2_Fonction2(int c)
{
    printf("调用文件myf2.c的f2_Fonction2成功\n");
    return c+2;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

上面两个文件一个是C++的,另一个是C的。两个文件各提供了两个函数。 首先我们用gcc命令将他们编译成目标文件myf1.o和myf2.o

gcc -c myf1.cpp myf2.c
  • 1
ar r mylib.lib myf1.o myf2.o
  • 1

现在,我们尝试在windows上调用这个库中的一个函数试试看。写一个简单的调用的C++程序main.cpp

//main.cpp
#include <iostream>
using namespace std;
void f1_Fonction1(int a, double b, char *c);
int main()
{
    char c;
    f1_Fonction1(1,2.0,&c); //调用了myf1里面的函数f1_Fonction
    cout << "Hello world!" << endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

然后用MinGW编译,先生成main.o文件

gcc -c main.cpp
  • 1

接着把main.o和函数库mylib.lib连接起来生成main.exe文件

g++ -o main.exe main.o mylib.lib
  • 1

什么是GNU

GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。

GNU是“GNU is Not Unix”的递归缩写。Stallman宣布GNU应当发音为Guh-NOO以避免与new这个单词混淆(注:Gnu在英文中原意为非洲牛羚,发音与new相同)。UNIX是一种广泛使用的商业操作系统的名称。由于GNU将要实现UNIX系统的接口标准,因此GNU计划可以分别开发不同的操作系统部件。GNU计划采用了部分当时已经可自由使用的软件,例如TeX排版系统和X Window视窗系统等。不过GNU计划也开发了大批其他的自由软件。

原文链接:https://blog.csdn.net/lee_ham/article/details/81778581

  文章知识点与官方知识档案匹配,可进一步学习相关知识 CS入门技能树Linux入门初识Linux41913 人正在系统学习中 2241431065 关注  

标签:git,cygdrive,mingw32,Windows,编译,调用,Cygwin,MingW,Linux
From: https://www.cnblogs.com/blj28/p/18344669

相关文章

  • Git 对比 SVN 的区别和优势
    引言版本控制系统(VCS)是软件开发过程中不可或缺的一部分,它们用于管理代码的变更、协调开发团队的工作。Git和SVN(ApacheSubversion)是目前最流行的两个版本控制系统。本文将详细分析Git和SVN的区别及各自的优势,帮助开发者选择最适合自己项目的版本控制系统。一、Git和S......
  • Git---分布式版本控制工具
    ......
  • AT_abl_e Replace Digits 题解
    题目传送门前置知识线段树解法需要维护区间信息,考虑使用线段树维护。预处理出\(\overline{xx\dotsx}\),其中\(x\in\{1,2,3,4,5,6,7,8,9\}\),便于区间赋值。然后就是普通的线段树板子了。代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#de......
  • git本地分支映射远程分支并推送相应代码
    在Git中,克隆仓库默认只会检出`master`分支(或`main`分支,取决于仓库的默认分支配置)。如果你想切换到不同的远程分支,可以按照以下步骤操作:1.**克隆仓库**(如果尚未克隆):```bashgitclone<repository-url>```这将克隆仓库并检出默认分支。2.**查看所有远程分支**:```ba......
  • Git 开发规范
    文章目录Git开发规范分支管理策略gitflowgithubflowgitlabflowtrunk-baseddevelopment总结CommitMessageGit开发规范分支管理策略gitflowVincentDriessen于2010年提出的分支模型,可以说是最早、最全面的分支管理策略了,后续出现的分支管理策略基本都是......
  • git基本用法
    Git是一种版本控制系统,它用于跟踪文件的更改并协调多个开发者之间的代码共享。Git的基本概念包括:仓库(repository):用于存储文件和文件夹的集合。仓库可以是本地仓库(存放在开发者本地计算机上)或远程仓库(存放在另一个地方,如Github)。分支(branch):分支是仓库中的一个可独立进行工......
  • github添加ssh密钥,通过ssh方式推送代码
    左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。公众号:一点sir,关注领取python编程资料很多人在使用github的时候,如果还是使用https的方式推送代码的话,可能会发现推送不上去,官方会建议你使用ssh的方式进行代码推送。通过ssh方式推送代码,速度更快,更高效,而且还不用......
  • Digitwise_addition:超出限制:如果超出 -> 代码超时
    我正在研究kata。按位加法是一种特殊的加法,它不是通常向数字加1,而是向该数字的每个数字加1。如果数字是9,我们将其替换为10,而不保留到下一个数字。示例123->234任务编写一个接受两个数字n和k的函数,并在应用数字加法k次后输出n中的位数。由于答......
  • GitHub页面(实现贪吃蛇效果等)美化主页详细大全!
    1.引言        ......
  • Git 智能传输协议
    Git-TransferProtocols(git-scm.com)Git中存在两种传输数据的协议:“dump”和“smart”协议。Dump协议类似HTTPS的Get请求,因为其安全性,已经很少被使用了。获取内容的大致流程:获取info/refs获取Head然后一次获取object对象。(loose形式)若获取某一对象失败,则尝试获取pac......