mingw(gcc)編譯出來的動態庫(DLL)默認是沒有MSVC鏈接動態庫所須要的lib文件(import library)的。shell
關於MSVC的DLL和LIB的做用和區別,請參考這篇博文,講得很透徹了–>《DLL和LIB的區別》app
那麼若是MSVC要連接gcc生成的DLL,卻沒有lib文件(import library)怎麼辦?
對於這個問題網上都有解決的辦法,這篇文章講到一些辦法,可供收藏《VC6 調用GCC的DLL》,對於沒有提供lib的DLL均可以用這篇文章提供的辦法試試。工具
若是項目中不一樣的模塊用不一樣的編譯器編譯,這時若是gcc編譯的DLL沒有import library(lib文件),能夠經過cmake設置選項讓gcc在編譯的的時候生成import library(lib文件)。ui
CMAKE有一個GNUtoMS參數就是解決這個問題的。.net
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.orm
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屬性)blog
因此,在用cmake生成Makefile時,設置GNUtoMS就能夠解決這個問題。有兩種途徑:ip
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
來源:CSDN
原文:https://blog.csdn.net/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)