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