最近編譯了一份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/