文档章节

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

明月惊鹊
 明月惊鹊
发布于 2017/08/16 17:09
字数 502
阅读 172
收藏 0

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

© 著作权归作者所有

明月惊鹊
粉丝 28
博文 69
码字总数 14973
作品 0
广州
高级程序员
私信 提问
手把手教你在Windows下使用MinGW编译libav

手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言开发的,不可避免的,libav源码使用了一些gcc的特性,那么在Windows下很难使用VC编译,但是使用MinGW编译却简单多了,...

shzwork
05/21
17
0
【转】Msys/MinGW与Cygwin/gcc

一 MinGW MinGW 官方网站为 http://www.mingw.org/ MinGW,即 Minimalist GNU For Windows(GCC compiler suite)。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情...

mj4738
2012/01/21
681
1
在Windows7/10上通过VS2013编译FFmpeg 4.1.3源码操作步骤

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengbingchun/article/details/90114411 多年前在https://blog.csdn.net/fengbingchun/article/details/4095...

fengbingchun
05/11
0
0
通过重编译icu替换icuxxxx.dll减少QT5发布体积

最近需要使用QT写一个程序,选择了比较新的QT5.3以获得更多特性进行快速开发。但是QTCreator编译出来的程序是动态链接版本,接着就头痛了,自己程序很小,但是所需要携带的动态链接库却很大,...

shzwork
09/19
22
0
MinGW在Win7下的按装、设置和使用 (Lu Hongling)

1.引言 MinGW is the abbreviation of “Minimalist GCC Windows”. 简单地说, MinGW就是windows下的GCC [2]. 在windows下按装了MinGW, 就按装了C/C++, Fortran, 等语言编译器套间. MinGW是完...

luhongling
2012/08/19
4K
0

没有更多内容

加载失败,请刷新页面

加载更多

面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
11分钟前
8
0
读书笔记:深入理解ES6 (八)

第八章 迭代器(Iterator)与生成器(Generator) 第1节 循环语句的问题   在循环、多重循环中,通过变量来跟踪数组索引的行为容易导致程序出错。迭代器的出现旨在消除这种复杂性,并减少循...

张森ZS
11分钟前
8
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
16分钟前
8
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
24分钟前
7
0
重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

导读:2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Open Application Model (OAM...

阿里云官方博客
27分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部