Это то, что работает для меня. Я скомпилировал этот исходный код 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 .
Как видите, я использовал MinGW-w64 из MSYS2, а не 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/stackoverflow/GNUtoMS
C:\Users\jacob\Documents\prog\stackoverflow\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
Никаких подчеркиваний и импсов вообще; тем не менее, это просто сработало.