在windows下编译某linux源码

时间:2022-07-30 17:35:26

最近编译了一份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/bestfighter_210@126/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/