天天看點

在windows下編譯linux,在windows下編譯某linux源碼

最近編譯了一份linux下寫的源碼,源碼中并無跨平台相關的代碼,是以win下無法直接編譯,而且源碼較多,在linux下./configure 後make,make install很容易就編譯并使用。

但由于要求把該linux源碼編譯成win下的庫在VS中調用,是以煞費工夫,總結一些東西,以免忘了。。。

cygwin 或者 msys2、mingw 下

./configure

make

make install

生成了一系列庫.a檔案和bin目錄下的exe測試程式,exe是由cygwin 或者 msys2、mingw直接連結.a庫生成的

對于純C語言寫的代碼,加了extern C{}後生成的庫.a檔案可以直接改成.lib在VS下調用

靜态

gcc -c *.c -o *.o -static

ar r *.a *.o

動态

gcc *.c *.dll -shared -o *.dll -Wl,--output-def,*.def,--out-implib,*.a -static

根據已生成的.a重新生成動态庫

ar x *.a 分解出.o檔案

gcc *.dll -fPIC -fopenmp -lstdc++ -shared -o out.dll *.o -Wl,--export-all-symbols,--output-def,*.def -static

根據生成的def和lib檔案,用vs的cmd工具生成lib檔案

lib /machine:ix86 /def:*.def

小結:

以上環境編譯的.a庫檔案或者.dll動态庫,無論是C函數還是C++類(可以不加__declspec(dllexport)),可以在原環境中直接調用

VC環境能調用cygwin環境編譯.a庫檔案或者.dll動态庫,限于加了extern C 關鍵字的C函數

VC環境不能調用cygwin環境編譯.a庫檔案或者.dll動态庫,對于C++代碼(含有C++類)

C++(含有C++類)代碼導出的靜态lib和動态dll在cygwin和vs中的軋名規則格式都不同,是以不能通用

對于C++(含有C++類)代碼,直接在vc中建立靜态庫工程(可以不加__declspec(dllexport)),導入以上生成的可以通用的C庫檔案

稍微改一點宏定義代碼,因為C++代碼部分對linux系統的依賴要少多了

生成的靜态庫檔案,但仍然依賴于之前通用的C動态庫dll

如果要生成動态庫,隻能在源碼中的每個類加可以不加__declspec(dllexport)了。。。

另外debug和release生成的不同庫在别的工程調用的時候也有差別

參考:

http://jeremiah.blog.51cto.com/539865/183560

http://www.bubuko.com/infodetail-373252.html

http://blog.sina.com.cn/s/blog_6df5709c0101fz7r.html

http://blog.csdn.net/gugu1313/article/details/5425805

http://blog.okbase.net/zgfnet/archive/3142.html

http://blog.163.com/[email protected]/blog/static/10361887201162245744422/

https://cygwin.com/cygwin-ug-net/dll.html#dll-build

http://www.csdn123.com/html/blogs/20130722/40683.htm

https://cygwin.com/ml/cygwin/2002-04/msg00864.html

http://argv.info/2011/01/26/some-problems-about-calling-c-dll-by-vc-and-gcc/

http://m.blog.chinaunix.net/uid-7437948-id-2055350.html

http://demangler.com/

http://d.fuqu.jp/c++filtjs/