【转发】MinGW 静态库a在MSVC中使用例子

原著网址;:

https://my.oschina.net/mingyuejingque/blog/1511290

MinGW 生成的静态库a,如何在vc里引用

原创
2017/08/16 17:09
阅读数 3.6K
 
 
 

假设有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链接会如何? 结果可以正常链接了。

posted on 2022-02-24 09:47  johnphan  阅读(846)  评论(0编辑  收藏  举报

导航