MinGW 无法为导出函数添加前缀 _impl_
MinGW fails to prefix _impl_ to exported functions
MinGW 应编译一个共享 C 库 mylib
,其中包含类似
的函数
declspec(dllexport) int foo();
库应在 Visual Studio 下的 C++ 应用程序中使用。
构建库(在 CMake 下,使用选项 GNUtoMS
)生成三个文件,mylib.dll mylib.dll.a mylinb.lib
。检查后者,
dumpbin /HEADERS mylib.lib
为每个导出函数打印一个姿势。上述函数 foo
的立场包含行
Symbol name : _foo
因此,MinGW 不会 生成前缀 _imp_
。预计链接依赖应用程序失败,因为 Visual Studio 找不到 _imp_foo
.
如何做对?
这对我有用。我编译了这个源码main.c
__declspec(dllexport) int foo()
{
return 42;
}
用这个CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(mylib)
add_library(mylib SHARED "main.c")
使用这个脚本build.bat
set "PATH=C:\msys64\mingw64\bin;%PATH%"
cmake ^
-G "MinGW Makefiles" ^
-D CMAKE_GNUtoMS=ON ^
-D CMAKE_GNUtoMS_VCVARS="C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Auxiliary/Build/vcvars64.bat" ^
-D CMAKE_C_COMPILER="x86_64-w64-mingw32-gcc.exe" ^
-D CMAKE_CXX_COMPILER="x86_64-w64-mingw32-g++.exe" ^
.
cmake --build .
如您所见,我使用的是 MSYS2 的 MinGW-w64 而不是 MinGW,但这应该没有任何区别。输出是:
-- The C compiler identification is GNU 9.2.0
-- The CXX compiler identification is GNU 9.2.0
-- Check for working C compiler: C:/msys64/mingw64/bin/x86_64-w64-mingw32-gcc.exe
-- Check for working C compiler: C:/msys64/mingw64/bin/x86_64-w64-mingw32-gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/msys64/mingw64/bin/x86_64-w64-mingw32-g++.exe
-- Check for working CXX compiler: C:/msys64/mingw64/bin/x86_64-w64-mingw32-g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/jacob/Documents/prog/Whosebug/GNUtoMS
C:\Users\jacob\Documents\prog\Whosebug\GNUtoMS>cmake --build .
Scanning dependencies of target mylib
[ 50%] Building C object CMakeFiles/mylib.dir/main.c.obj
[100%] Linking C shared library libmylib.dll
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.4.3
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
Microsoft (R) Library Manager Version 14.24.28315.0
Copyright (C) Microsoft Corporation. All rights reserved.
Creating library libmylib.lib and object libmylib.exp
[100%] Built target mylib
然后我创建了一个程序prog.c
#include <stdio.h>
__declspec(dllimport) int foo();
int main (void)
{
printf("%d\n", foo());
return 0;
}
并使用
编译
cl.exe prog.c libmylib.lib -o prog.exe
链接成功,生成的程序打印42。dumpbin.exe显示的符号为
Symbol name : foo
没有任何下划线和 imps;尽管如此,它还是奏效了。
比原始 MinGW 更喜欢分叉 MinGW-w64
而不是
mingw.exe
来自 http://MinGW.org,
使用
x86_64-w64-mingw32-gcc
来自 http://www.msys2.org.
有了这个,dumpbin.exe
发现没有
Symbol name : _foo
但是
Symbol name : foo
和Visual Studio链接成功libmylib.lib
。
有关 mingw 与 msys2/mingw-w64 的背景,请参阅 Wikipedia:“在 ... 2013 年启动了一个新项目,MSYS2 以及 32 位和 64 位 MinGW 软件包。该项目创建是为了跟踪 Cygwin 项目的最新进展... MSYS2 是 MSYS 的独立重写,基于现代 Cygwin(POSIX 兼容层)和 MinGW-w64,目的是与原生 Windows 软件。"
MinGW is a registered trademark licensed to the MinGW project. The names of the compilers in the MSYS2 project are somewhat confusing: Occasionally they are called MinGW for short; the executables have mingw32
in their name even when dedicated to 64 bits; the official name seems to be MinGW-w64.
感谢@jacob 在他的 中使用 MinGW-w64
提供了决定性的提示。
MinGW 应编译一个共享 C 库 mylib
,其中包含类似
declspec(dllexport) int foo();
库应在 Visual Studio 下的 C++ 应用程序中使用。
构建库(在 CMake 下,使用选项 GNUtoMS
)生成三个文件,mylib.dll mylib.dll.a mylinb.lib
。检查后者,
dumpbin /HEADERS mylib.lib
为每个导出函数打印一个姿势。上述函数 foo
的立场包含行
Symbol name : _foo
因此,MinGW 不会 生成前缀 _imp_
。预计链接依赖应用程序失败,因为 Visual Studio 找不到 _imp_foo
.
如何做对?
这对我有用。我编译了这个源码main.c
__declspec(dllexport) int foo()
{
return 42;
}
用这个CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
project(mylib)
add_library(mylib SHARED "main.c")
使用这个脚本build.bat
set "PATH=C:\msys64\mingw64\bin;%PATH%"
cmake ^
-G "MinGW Makefiles" ^
-D CMAKE_GNUtoMS=ON ^
-D CMAKE_GNUtoMS_VCVARS="C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Auxiliary/Build/vcvars64.bat" ^
-D CMAKE_C_COMPILER="x86_64-w64-mingw32-gcc.exe" ^
-D CMAKE_CXX_COMPILER="x86_64-w64-mingw32-g++.exe" ^
.
cmake --build .
如您所见,我使用的是 MSYS2 的 MinGW-w64 而不是 MinGW,但这应该没有任何区别。输出是:
-- The C compiler identification is GNU 9.2.0
-- The CXX compiler identification is GNU 9.2.0
-- Check for working C compiler: C:/msys64/mingw64/bin/x86_64-w64-mingw32-gcc.exe
-- Check for working C compiler: C:/msys64/mingw64/bin/x86_64-w64-mingw32-gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/msys64/mingw64/bin/x86_64-w64-mingw32-g++.exe
-- Check for working CXX compiler: C:/msys64/mingw64/bin/x86_64-w64-mingw32-g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/jacob/Documents/prog/Whosebug/GNUtoMS
C:\Users\jacob\Documents\prog\Whosebug\GNUtoMS>cmake --build .
Scanning dependencies of target mylib
[ 50%] Building C object CMakeFiles/mylib.dir/main.c.obj
[100%] Linking C shared library libmylib.dll
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.4.3
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
Microsoft (R) Library Manager Version 14.24.28315.0
Copyright (C) Microsoft Corporation. All rights reserved.
Creating library libmylib.lib and object libmylib.exp
[100%] Built target mylib
然后我创建了一个程序prog.c
#include <stdio.h>
__declspec(dllimport) int foo();
int main (void)
{
printf("%d\n", foo());
return 0;
}
并使用
编译cl.exe prog.c libmylib.lib -o prog.exe
链接成功,生成的程序打印42。dumpbin.exe显示的符号为
Symbol name : foo
没有任何下划线和 imps;尽管如此,它还是奏效了。
比原始 MinGW 更喜欢分叉 MinGW-w64
而不是
mingw.exe
来自 http://MinGW.org,
使用
x86_64-w64-mingw32-gcc
来自 http://www.msys2.org.
有了这个,dumpbin.exe
发现没有
Symbol name : _foo
但是
Symbol name : foo
和Visual Studio链接成功libmylib.lib
。
有关 mingw 与 msys2/mingw-w64 的背景,请参阅 Wikipedia:“在 ... 2013 年启动了一个新项目,MSYS2 以及 32 位和 64 位 MinGW 软件包。该项目创建是为了跟踪 Cygwin 项目的最新进展... MSYS2 是 MSYS 的独立重写,基于现代 Cygwin(POSIX 兼容层)和 MinGW-w64,目的是与原生 Windows 软件。"
MinGW is a registered trademark licensed to the MinGW project. The names of the compilers in the MSYS2 project are somewhat confusing: Occasionally they are called MinGW for short; the executables have mingw32
in their name even when dedicated to 64 bits; the official name seems to be MinGW-w64.
感谢@jacob 在他的 MinGW-w64
提供了决定性的提示。