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
- 导出dll的def文件
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