mingw源碼
Ⅰ minGW的gdb調試,list命令顯示出來的源代碼不換行,
Windows的換行是\r\n,Unix的換行是\n,你查看一下txt的配置是否正確。
Ⅱ MinGW的QT怎麼調用VC生成的靜態鏈接庫
Qt如何調用VC++生成的動態鏈接庫?假設當前有VC++編譯器生成的動態庫文件testdll.h,testdll.lib和testdll.dll。
testdll.h文件源碼如下:
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
// 此類是從 testdll.dll 導出的
class TESTDLL_API Ctestdll {
public:
Ctestdll(void);
public:
int Add(int a, int b) {return a+b;}
int Sub(int a, int b) {return a-b;}
int Mul(int a, int b) {return a*b;}
};
extern TESTDLL_API int ntestdll;
TESTDLL_API int fntestdll(void);
Qt如何使用這些動態鏈接庫文件?
一、情況1,編程環境是Qt Creator+Qt libraries 4.8.6 for Windows (VS 2010)
Qt庫是VS2010版本,VC++編譯器生成的。所以工程可以直接使用testdll.h頭文件和testdll.lib引入庫文件。
1、把testdll.h拷貝到工程路徑;
2、工程文件XXX.pro需要手動添加"HEADERS += testdll.h"和"LIBS += testdll.lib";
3、編譯前,需要把lib文件:testdll.lib和testdll.dll一起拷貝到構建路徑下面。
如此便可以正常使用VC++動態鏈接庫函數。
二、情況2,編程環境是Qt Creator+Qt libraries 4.8.6 for Windows (MinGW 4.8.2)
Qt庫是MinGW版本,gcc編譯器生成,與VC++編譯器不是同個體系。所以工程不可以使用testdll.h頭文件和testdll.lib引入庫文件。
對於調用DLL的方法,Qt本身就有相應的類來實現。
#include "dialog.h"
#include <QApplication>
#include <QLibrary>
typedef int (*func_Add)(int a, int b); //定義函數指針
typedef int (*func_Sub)(int a, int b);
typedef int (*func_Mul)(int a, int b);
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLibrary mylib("testdll.dll");//testdll.dll的存放路徑與.exe一致
if (mylib.load())
{
//"?Add@Ctestdll@@QAEHHH@Z"等字元串其實就是動態庫函數int Add(int a, int b)的變體,請使用微軟工具DEPENDS.EXE查看得到
func_Add f1 = (func_Add)mylib.resolve("?Add@Ctestdll@@QAEHHH@Z");
func_Sub f2 = (func_Sub)mylib.resolve("?Sub@Ctestdll@@QAEHHH@Z");
func_Mul f3 = (func_Mul)mylib.resolve("?Mul@Ctestdll@@QAEHHH@Z");
int rt = 0;
if (f1 != NULL)
{
rt = f1(10, 12);
}
if (f2 != NULL)
{
rt = f2(10, 12);
}
if (f3 != NULL)
{
rt = f3(10, 12);
}
}
Dialog w;
w.show();
return a.exec();
}
Ⅲ cygwin和mingw的區別
Unix下編譯通過的C代碼,在win32下編譯是不能通過的 ,當然Unix 和win32的API都是符合標准C,也就是說,大多數函數調用在unix和win32下是相同的.但是,unix有自己一些獨特的API(如fork,spawn,signals,select,sockets等),如果代碼中使用了這些API,在win32下當然找不到對應的庫.
但是,這些API的功能在win32中也能實現,也許你已經發現了一個能讓window編譯Unix風格代碼的方法:
1.修改編譯器,讓window下的編譯器把諸如fork的調用翻譯成等價的形式--這就是mingw的做法.
2.修改庫,讓window提供一個類似unix提供的庫,他們對程序的介面如同unix一樣,而這些庫,當然是由win32的API實現的--這就是cygwin的做法.
MinGW相比CygWin/gcc來講,更加貼近win32。因為它幾乎支持所有的Win32API。它所連接的程序,不需要任何第三方庫即可運行。
CygWin/gcc,其實這是兩個東西。CygWin是一個讓Windows擁有Unix-like環境的軟體。而gcc就是安裝在CygWin上的編譯器。
CygWin/gcc與MinGW的最大區別在於:使用CygWin/gcc可以在Windows下調用unix-like的API,(如fork,spawn,signals,select,sockets等)。也就是說Cygwin是運行在Windows下的,但是她使用的是Unix-like系統的函數和思想。由於這個區別,導致的結果就是用CygWin/gcc編譯出來的程序可以無縫的運行在*nix環境下。但是如果調用了unix特有的API函數,在windows環境下不能正常運行,如果想在windows下正常運行的,就必須依賴cygwin1.dll,速度上會有些影響。
而用MinGW編譯出來的程序,如果源代碼裡面調用了unix環境的API,則MinGW會把這些對UNIX的API調用翻譯成win32下等價的形式。同時這個程序是不能在windows下運行的。
說白了,如果你是想在windows環境下開發linux運行程序,那麼CygWin/gcc是你的不二之選。
而如果你想開發的是windows運行程序,並且追求速度,那麼二者相比而言,MinGW是更好的選擇
我沒有用過這兩個工具,只是有點想選擇一個來用,於是在網上比較一下兩者有啥不同,然後選一個適合自己的。過程中,我發現網上一份文章可能被多個人轉載,被多個人稍微修改後當成自己的隨筆寫出,誤認不淺。
說一點,什麼cygwin編譯的程序可以無縫在linux上運行,根本就不能這么理解。
cygwin官方的一個定義是Cygwin is not a way to run native linux apps on Windows. You have to rebuild your application from source if you want it to run on Windows.
翻譯過來就是
cygwin不是讓linux程序能在windows上運行的方法,如果你想要讓linux程序能在windows運行,那麼你只有用cygwin來重新編譯一下源文件。
這句話完全反駁了無縫運行在linux的說法。就是說你在linux上編譯的elf程序不能直接拿到cygwin上運行,同樣,你用cygwin編譯的程序也不是linux的elf格式,而是exe格式,exe是無法在linux上運行的。
cygwin和mingw都是為用戶提供在windows操作系統使用GNU工具的方法,使得在windows上可以編譯為linux寫的c源代碼並運行(讓你可以用signal等linux才有的api)。真正的不同在於
1,cygwin大,mingw小
2,cygwin編譯後的exe需要cygwin1.dll作為支持,而mingw不需要就可以直接運行,因為有中間層所以cygwin慢,mingw快。
3,cygwin包含的內容更全面,能編譯通過的linux源文件更多,mingw的min是minimalist所以能編譯通過的更少。但,不是全部,就是說別指望你可以把任何為linux寫的源代碼在cygwin或mingw編譯通過並運行。
在網上找的,不知道對不對
Ⅳ Eclipse+CDT+MinGW,如何搭配glibc源碼包來查看不熟悉的函數的具體實現
數組越界了 返回 的是 數組的最後一個元素 後的 不屬於數組的元素 越界了
估計你想返回 整個數組 , 不要有返回這個數組這種錯誤的想法
你該思考 返回指向字元串的指針!
Ⅳ mingw w64源碼怎麼編譯
應該是先安裝MSYS,再安裝mingw , 在mingw文件夾裡面應該有個bin文件夾 ,留意一下該文件夾裡面「應該」有gcc.exe的應用程序,假設該bin文件夾的全稱路徑是X:\..\mingw\bin,那麼將它添加將它添加到環境變數裡面。
Ⅵ 有一個庫的源代碼,怎麼用mingw編譯產生成lib
mingw編譯出來的靜態庫後綴名為.a,編譯出來的動態庫的導入庫後綴名為.dll.a,而在windows下後綴名為.lib的庫可能是靜態庫也可能是動態庫的導入庫。
mingw編譯出來的動態庫的導入庫可以直接在vc中直接使用,例如
#pragma comment(lib, "libx264.dll.a")
這樣你就不需要生成一個.lib後綴的動態庫的導入庫了,網上也有如何從.dll生成.lib的方法。
如果鏈接了動態庫的導入庫libpthread.dll.a,你發布的應用程序就要帶上pthread的dll。
使用靜態庫的好處是發布的應用程序組件模塊里不需要帶上相關的dll,如果要使用mingw編譯出來的靜態庫,可以如下:
#pragma comment(lib, "libx264.a")
但是僅僅鏈接這么一個靜態庫是不夠的,你還需要鏈接
libgcc.a
libmingwex.a
Ⅶ 關於mingw
MinGWStudio完整安裝後有78M大小比起Vc6+DDK要小很多,而且MinGWStudio安裝目錄下的MinGW\include\ddk\目錄里有一個叫ntapi.h的頭文件,裡麵包括了很多未公開的函數原型及數據結構,感覺很爽啊!還有一個更爽的地方呢!那就是MinGW可以混用Windows XP SDK和DDK頭文件卻不會出現任何錯誤,在VC6中只能用namespace來解決這個問題,但MinGW里直接include頭文件就行了,用戶態程序可以使用用戶態可用的未公開函數,記得引入ntdll.a庫文件.
精簡的IDE,簡單的代碼完成功能,沒有向導,純手工寫代碼.怎麼看怎麼覺得這東西適合Eva,呵呵!
用QuickSys向導了一個空的驅動框架HelloDrv,只改了一行代碼:
#include "ntddk.h"
改成
#include "ddk\ntddk.h"
就可以毫不費力的用gcc編譯成KMD
D:\wjj\vcwork\hellodrv>gcc -o HelloDrv.obj -O3 -c HelloDrv.c
D:\wjj\vcwork\hellodrv>ld HelloDrv.obj --subsystem=native --image-base=0x10000 --file-alignment=0x1000 --section-alignment=0x1000 --entry=_DriverEntry -nostartfiles -nostdlib -L E:\MinGWStudio\MinGW\lib -l ntoskrnl -o HelloDrv.sys
由於gcc支持C99標准,可以使用動態數組以及隨處定義局部變數,雖然同樣是用C程序來寫驅動,但其實卻比VC要靈活很多.另外gcc的代碼優化能力相信不用我多說.
沒有想到脫離Visual Studio也可以寫SDK和DDK程序.開源組織里真的有很多好東東啊!gcc包里的Pascal編譯器gpc可以支持Object Pascal,支持AT&T Inline Asm,支持直接使用MMX/SSE/SSE2數據類型及指令,寫游戲都沒有問題.比起Delphi的編譯器dcc32真的是要強到哪裡去了,只是沒有人知道.
努力......
Ⅷ 怎樣在MinGW上下載siesta
在MinGW上下載siesta操作方法
下載地址
鏈接:https://pan..com/s/1Sg3zC7n_scaY99avGLiMEg
提取碼:kii0
第一步獲取源碼
從Siesta官網下載最新版本的Siesta源碼: https://departments.icmab.es/leem/siesta/。或者使用命令行下載工具curl或者wget來下載:
wget -c -O ${HOME}/softwares/siesta-4.1-b4.tar.gz https://launchpad.net/siesta/4.1/4.1-b4/+download/siesta-4.1-b4.tar.gz
第二步配置翻譯並安裝
進入代碼根目錄,下的Obj文件夾:
cd siesta-4.1-b4/Obj
然後執行以下命令:
bash ../Src/obj_setup.sh
這將在執行Siesta的一個腳本來在當前路徑下產生構建配置文件,此時需要修改arch.make文件中的一些參數。
需要修改指定的變數如下:
.SUFFIXES:.SUFFIXES: .f .F .o .c .a .f90 .F90SIESTA_ARCH =x86_64-unknown-linux-gnu--unknownCC = gccFPP = $(FC) -E -P -x cFC = mpif90 #gfortran# FC_SERIAL = gfortranFFLAGS = -O2 -fPIC -ftree-vectorize# FFLAGS=-gAR = arRANLIB = ranlibSYS = nagSP_KIND = 4DP_KIND = 8KINDS = $(SP_KIND) $(DP_KIND)LDFLAGS =COMP_LIBS = libsiestaLAPACK.a libsiestaBLAS.aFPPFLAGS = $(DEFS_PREFIX)-DFC_HAVE_ABORT# Dependency rules ---------FFLAGS_DEBUG = -g -O # your appropriate flags here...# added by EmuLab# For GNU compiler# the siesta guide tell me to add the FFLAGS and LIBS parameter below, but it get thing wrong,# after comment them i succeeded in the compilation!# FFLAGS += -fopenmp# LIBS += -fopenmp# OpenBLAS + LAPACK:# OpenBLAS (OpenBLAS will default to build in LAPACK 3.6)# LIBS += -L/opt/openblas/0.2.18/lib -lopenblas# use the LAPACK and BLAS provided by SIESTA# ScaLAPACK# ScaLAPACK Only required for MPI compilation.# LIBS += -L/opt/scalapack/2.0.2/lib -lscalapack# NETCDF added by deqitangINCFLAGS += -I${HOME}/softwares/netcdf_install/includeLDFLAGS += -L${HOME}/softwares/zlib_install/lib -Wl,-rpath=${HOME}/softwares/zlib_install/libLDFLAGS += -L${HOME}/softwares/hdf5_install/lib -Wl,-rpath=${HOME}/softwares/hdf5_install/libLDFLAGS += -L${HOME}/softwares/netcdf_install/lib -Wl,-rpath=${HOME}/softwares/netcdf_install/libLIBS += -lnetcdff -lnetcdf -lhdf5_hl -lhdf5 -lzCOMP_LIBS += libncdf.a libfdict.aFPPFLAGS += -DCDF -DNCDF -DNCDF_4#DUMMY_FOX = --enable-mmy# For netCDF support. Make sure you get a version compatible# with the other options (for example, 32/64 bit). Don't forget# to set -DCDF below.NETCDF_ROOT= ${HOME}/softwares/netcdf_installNETCDF_LIBS= -L$(NETCDF_ROOT)/lib -lnetcdffNETCDF_INCFLAGS= -I$(NETCDF_ROOT)/include# HDF-5.HDF5_ROOT= ${HOME}/softwares/hdf5_installHDF5_LIBS = -I$(HDF5_ROOT)/include# endCOMP_LIBS += libfdict.aLIBS = $(COMP_LIBS) $(NETCDF_LIBS)#SIESTA needs an F90 interface to MPI#This will give you SIESTA's own implementation#If your compiler vendor offers an alternative, you may change#to it here.# MPI_INTERFACE=libmpi_f90.a#MPI_INCLUDE=${HOME}/softwares/openmpi_install/include# end by deqitang@# The atom.f code is very vulnerable. Particularly the Intel compiler# will make an erroneous compilation of atom.f with high optimization# levels.atom.o: atom.F $(FC) -c $(FFLAGS_DEBUG) $(INCFLAGS) $(FPPFLAGS) $(FPPFLAGS_fixed_F) $<.c.o: $(CC) -c $(CFLAGS) $(INCFLAGS) $(CPPFLAGS) $<.F.o: $(FC) -c $(FFLAGS) $(INCFLAGS) $(FPPFLAGS) $(FPPFLAGS_fixed_F) $<.F90.o: $(FC) -c $(FFLAGS) $(INCFLAGS) $(FPPFLAGS) $(FPPFLAGS_free_F90) $<.f.o: $(FC) -c $(FFLAGS) $(INCFLAGS) $(FCFLAGS_fixed_f) $<.f90.o: $(FC) -c $(FFLAGS) $(INCFLAGS) $(FCFLAGS_free_f90) $<
然後執行make構建siesta:
make siesta
構建完siesta後,如果你需要構建transiesta,需執行:
make cleanmake transiesta
還有一個常用的工具是tbtrans,其位於SIesta項目的./Util/TS/TBtrans目錄下,通過下面命令來構建:
cd ../Util/TS/TBtransmake
注意Siesta的構建系統 沒有提供make install。因此我們可以將編譯的到的可執行程序移動到一個目錄,然後將該路徑添加到環境變數中,方便在終端中調用程序。
就此,常用的工具構建完畢。
第三步設置環境變數
在~/.bashrc文件中添加如下內容:
export PATH=$PATH:/home/xxx/softwares/siesta_bin
這里假設,我們將之前編譯得到的siesta、transiesta、tbtrans程序都拷貝到了/home/xxx/softwares/siesta_bin中。
Ⅸ mingw怎麼獲得仿posix的環境
MinGW默認安裝MSYS。通常打開的 MinGW Shell 其實 MSYS,MinGW 作為一個組件存在。
MSYS -- Minimal SYStem,是一個 Bourne Shell 解釋器。
MinGW -- Minimalist GNU for Windows. 基於原生 windows 的開發環境,不是虛擬機。
以 MinGW 安裝根目錄為 D:/MinGW/ 為例。
1. 掛載文件系統
掛載到 MSYS 下可以方便使用,新版的 MinGW 已經默認自動掛載。
對於其他的文件夾,可以用同樣的方式自動掛載。
配置文件 D:/MinGW/msys/1.0/etc/fstab ,一行一組掛載配置。"原路徑 掛載位置" 的格式。
如下:
復制代碼代碼如下:
d:/MinGW/ /mingw
D:/ /home/jackon/d
默認只有第一行,所以只自動掛載了 MinGW。
最好在末尾留一個空行。因為,手動掛載的信息也會寫入 fstab,且不會另起一行開始寫。
手動掛載時需注意:
1. 所有的路徑都要使用 linux 格式的 '/'
2. 掛載的目標路徑使用絕對路徑,且需要保證路徑存在。
手動掛載過程截圖如下。
第三方庫安裝可以從源碼編譯安裝,也可以將編譯後的可執行文件放在 D:/MinGW/msys/1.0/bin 目錄下。
復制代碼代碼如下:
./configure --prefix=/mingw
make
make install
3. 關聯 windows 下的 vim
在 D:/MinGW/msys/1.0/etc/profile 文件中 alias 一個命令指向 windows 可執行程序即可。
注意,路徑中如果有空格,需要使用轉義字元 '/ '。例如,關聯外部的 vim
復制代碼代碼如下:
alias vim="/C/Program/ Files/Vim/vim73e/vim.exe"
啟動 vim 後,不會使用本地的配置文件。可以將 vim 配置文件復制一份到 MSYS 的目錄下。
未找到啟動前修改 runtimepath 的方法 -- 嘗試著掛載 或 軟鏈接
4. 顯示控制
通過修改 D:/MinGW/msys/1.0/etc/profile 可以更改配置信息,同 linux 的 profile 文件。 Jackon@windows 處控制顯示文本, /u 使用本地用戶名,/h 顯示 host 地址。
復制代碼代碼如下:
export PS1='/[/033]0;$MSYSTEM:/w/007
/033[32m/]Jackon@windows /[/033[33m/w/033[0m/]
$ '