【转发】MinGW 静态库a在MSVC中使用例子
假设有2个h和 2个cpp, 要用Mingw来生成静态库libax.a
代码如下:
//ax.h
#pragma once
class AX {
public:
int add(int i);
};
extern "C"
int ax(int i);
//ax.cpp
#include "ax.h"
int AX::add(int i) {
return ++i;
}
int ax(int i) {
AX a;
return a.add(i);
}
//func.h
#pragma once
extern "C"
int func(int i);
//func.cpp
#include "func.h"
int func(int i) {
return ++i;
}
先用Mingw来生成静态库:
g++ -c func.cpp ax.cpp
ar rsv libax.a func.o ax.o
然后在 nm libax.a 里可以看到:
$ nm libax.a
ax.o:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$zzz
00000000 t .text
00000000 T __ZN2AX3addEi
00000014 T _ax
func.o:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$zzz
00000000 t .text
00000000 T _func
下面是vc 里引用这个静态库:
// Helloworld.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "func.h"
#include "ax.h"
#pragma comment(lib, "libmsvcrt.a")
#pragma comment(lib, "libmingwex.a")
#pragma comment(lib, "libgcc.a")
#pragma comment(lib, "libstdc++.a")
#pragma comment(lib, "libax.a")
int main()
{
printf("%d\n", func(1));
printf("%d\n", ax(3));
return 0;
}
这样 vs2017 可以正常编译、链接, 且生成的exe可以正确运行。
下面记录一下这个摸索过程中的一种情况:
如果上面没有 func.h, func.cpp文件, 只用 ax.h, ax.cpp这2个文件来生成静态库a, 那么在vc链接的时候会报错:
fatal error LNK1143: 无效或损坏的文件: 没有 COMDAT 0x6 节的符号
(仔细看看, ax.h 和 ax.cpp 中定义了一个类, 也就是包含了“C++”的代码。 )
nm libax.a 可以看到:
$ nm libax.a
ax.o:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$zzz
00000000 t .text
00000000 T __ZN2AX3addEi
00000014 T _ax
它也有符号啊, 虽然AX这个类被名称修饰了,但是不至于会导致 vc 认为这个a文件无效啊。
如果只用 func.h, func.cpp 这2个文件(c 的形式,没有c++类和库等等),生成的 a 文件, vc 就可以正常链接。
哈哈哈哈哈, 是不是可以试试 func.h, func.cpp, ax.h, ax.cpp 一起编译、打包成静态库 a,再给vc链接会如何? 结果可以正常链接了。