cmake:让mingw(gcc)生成MSVC可用的dll(.lib)

本文介绍如何在使用不同编译器的项目中,通过CMake配置让MinGW编译的DLL生成MSVC所需的import library(lib文件),解决了跨编译器集成问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mingw(gcc)编译出来的动态库(DLL)默认是没有MSVC连接动态库所需要的lib文件(import library)的。

关于MSVC的DLL和LIB的作用和区别,请参考这篇博文,讲得很透彻了–>《DLL和LIB的区别》

那么如果MSVC要链接gcc生成的DLL,却没有lib文件(import library)怎么办? 
对于这个问题网上都有解决的办法,这篇文章讲到一些办法,可供收藏《VC6 调用GCC的DLL》,对于没有提供lib的DLL都可以用这篇文章提供的办法试试。

如果项目中不同的模块用不同的编译器编译,这时如果gcc编译的DLL没有import library(lib文件),可以通过cmake设置选项让gcc在编译的的时候生成import library(lib文件)。

CMAKE有一个GNUtoMS参数就是解决这个问题的。

GNUtoMS 
Convert GNU import library (.dll.a) to MS format (.lib).

When linking a shared library or executable that exports symbols using GNU tools on Windows (MinGW/MSYS) with Visual Studio installed convert the import library (.dll.a) from GNU to MS format (.lib). Both import libraries will be installed by install(TARGETS) and exported by install(EXPORT) and export() to be linked by applications with either GNU- or MS-compatible tools.

CMAKE_GNUtoMS 
Convert GNU import libraries (.dll.a) to MS format (.lib).

This variable is used to initialize the GNUtoMS property on targets when they are created. See that target property for additional information.(这个变量用来初始化GNUtoMS属性)

所以,在用cmake生成Makefile时,设置GNUtoMS就可以解决这个问题。有两种途径:

shell命令行方式
如下在命令行中-D参数定义一个为BOOL类型的CMAKE_GNUtoMS参数为ON,就指示在编译时对dll生成import library(.lib)

cmake %source_folder% -G “Eclipse CDT4 - MinGW Makefiles” -DCMAKE_GNUtoMS:BOOL=ON

cmak-gui
如下在cmake-gui界面中将CMAKE_GNUtoMS选项勾选,再点<generate>按钮生成Makefile

然后执行make编译项目的过程中,生成dll时会输出下面的信息(前提是你安装了VC编译器)表明它在调用VC的lib(dll工具)生成import library(.lib)

Setting environment for using Microsoft Visual Studio 2010 x64 tools.

Microsoft (R) Library Manager Version 10.00.30319.01

Copyright (C) Microsoft Corporation. All rights reserved.

正在创建库 libturbojpeg.lib 和对象 libturbojpeg.exp

编译完成后,你就会发现所有的dll都有对应的lib文件了。
--------------------- 
作者:10km 
来源:优快云 
原文:https://blog.youkuaiyun.com/10km/article/details/50525604 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

weishijian
weishijian: 博主,您好 我现在可以生成dll文件,但是不能在vs中使用呢?? 我的cpp 和 h文件如下: mylib.h: #ifndef MYLIB_H #define MYLIB_H extern "C" { int add(int a, int b); } #endif /* !MYLIB_H */ mylib.cpp #include <stdlib.h> #include "mylib.h" #include <stdio.h> int add(int a, int b){ return a + b; } CMakeLists.txt : cmake_minimum_required (VERSION 2.8) # projectname is the same as the main-executable set(BUILD_SHARED_LIBS ON) add_library(mylib mylib.cpp) CMAKE_GNUtoS_VCVARS = C:/Program Files (x86)/Microsoft Visual Studio 11.0/VC/bin/amd64/vcvars64.bat VS2012中的console 工程中的cpp文件: #include "stdafx.h" #include "mylib.h" #pragma comment(lib, "libmylib.lib") int _tmain(int argc, _TCHAR* argv[]) { int a = add(10, 20); return 0; } 但最后执行的 时候提示: Error    1    error LNK2019: unresolved external symbol _add referenced in function _wmain D:\work\VS\testdll\testdll\testdll.obj    testdll 是我什么文件写的不对吗???(11个月前#5楼)查看回复(2)
0
weishijian
weishijian: 谢谢博主,设置BUILD_SHARED_LIBS之后,就能生成dll格式的lib库。 关于CMAKE_GNUtoS_VCVARS 这个变量, 我是在cmake_gui中,勾选 CMAKE_GNUtoMS 之后,再次点击configure,出现的一个变量,但在cmake.org中,没找到对于的解释。 也许不同版本的VS,对同样的代码编译的dll库也多少有些不同吧。(11个月前#4楼)查看回复(1)
0
weishijian
weishijian: 博主,你好,我在cmake_gui中勾选和不勾选 CMAKE_GNUtoMS , 最后都是只能生成 .a 的lib库,这是什么问题呢? 我安装了VS, cmake_GNUtoS_VCVARS = C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Auxiliary/Build/vcvars64.bat 我的CMakeLists.txt 很简单 cmake_minimum_required (VERSION 2.8) add_library(TEST test.c)

转载于:https://my.oschina.net/u/4000302/blog/3029355

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值