> 文章列表 > MSVC和MinGW导出的.dll.a和.lib相互调用

MSVC和MinGW导出的.dll.a和.lib相互调用

MSVC和MinGW导出的.dll.a和.lib相互调用

MSVC和MinGW导出的.dll.a和.lib相互调用

如需转载请标明出处:http://blog.csdn.net/itas109

环境:

OS: windows 10
MinGW64: x86_64-8.1.0-release-posix-seh-rt_v6-rev0
MSVC: VS2019

0. 测试程序

目录结构

$ tree
.
|-- CMakeLists.txt
|-- lib
|   |-- CMakeLists.txt
|   |-- myadd.cpp
|   `-- myadd.h
`-- main.cpp
  • myadd.h
// myadd.h#if defined(_WIN32)
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __attribute__((visibility("default")))
#endif#ifdef __cplusplus
extern "C"{
#endifint DLL_EXPORT myAdd(int x, int y);#ifdef __cplusplus
}
#endif
  • myadd.cpp
// myadd.cpp#include "myadd.h"int myAdd(int x, int y)
{return x + y;
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)project(myadd)set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})include_directories(.)add_library( ${PROJECT_NAME} SHARED myadd.cpp)
  • main.cpp
cmake_minimum_required(VERSION 2.8.12)project(myadd)set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})include_directories(.)add_library( ${PROJECT_NAME} SHARED myadd.cpp)
  • CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)project(main)# thirdlib
include_directories(lib)
link_directories(lib)add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} libmyadd)

1. MSVC调用MinGW导出的dll

1.1 方式1:pexports和lib手动转换

  • 编译MinGW的dll
$ cd lib
$ set path=D:\\mingw64\\bin;%path%
$ cmake -B bin -G "MinGW Makefiles"
$ cmake --build bin

pexports下载

$ pexports libmyadd.dll > libmyadd.def

查看def文件内容

$ cat libmyadd.def
LIBRARY libmyadd.dll
EXPORTS
myAdd
  • 使用msvc的lib命令生成.lib
$ call "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\\vcvars32.bat" x64$ lib /machine:X64 /def:libmyadd.def
...正在创建库 libmyadd.lib 和对象 libmyadd.exp$ $ tree
.
|-- CMakeLists.txt
|-- libmyadd.def
|-- libmyadd.dll
|-- libmyadd.dll.a
|-- libmyadd.exp
|-- libmyadd.lib
|-- myadd.cpp
`-- myadd.h

方式2:CMAKE_GNUtoMS自动转换

CMAKE_GNUtoMS可以转换 GNU导入库 (.dll.a) 为 MSVC格式 (.lib)

$ cd lib
$ set path=D:\\mingw64\\bin;%path%
$ cmake -B bin -G "MinGW Makefiles" -DCMAKE_GNUtoMS=ON
$ cmake --build bin
[ 50%] Building CXX object CMakeFiles/myadd.dir/myadd.cpp.obj
[100%] Linking CXX shared library ..\\libmyadd.dll
...
[vcvarsall.bat] Environment initialized for: 'x64'
...正在创建库 ..\\libmyadd.lib 和对象 ..\\libmyadd.exp
[100%] Built target myadd$ tree
.
|-- CMakeLists.txt
|-- libmyadd.def
|-- libmyadd.dll
|-- libmyadd.dll.a
|-- libmyadd.exp
|-- libmyadd.lib
|-- myadd.cpp
`-- myadd.h

2. MinGW调用MSVC导出的dll

  • 编译MSVC的dll
$ cd lib
$ cmake -B bin
$ cmake --build bin
  • 导出dll的def文件

pexports下载

$ pexports libmyadd.dll > libmyadd.def

查看def文件内容

$ cat libmyadd.def
LIBRARY libmyadd.dll
EXPORTS
myAdd
  • 使用MinGW的dlltool命令生成.dll.a
$ cat libmyadd.def
LIBRARY libmyadd.dll
EXPORTS
myAdd