MinGW не может префикс _impl_ для экспортируемых функций - PullRequest
0 голосов
/ 21 января 2020

MinGW должен скомпилировать общую C библиотеку mylib, которая содержит такие функции, как

declspec(dllexport) int foo();

Библиотека должна использоваться в приложении C ++ под Visual Studio.

Сборка библиотеки (в CMake, с параметром GNUtoMS) выдает три файла, mylib.dll mylib.dll.a mylinb.lib. Чтобы проверить последнее,

dumpbin /HEADERS mylib.lib

печатает одну позицию для каждой экспортируемой функции. Позиция для вышеуказанной функции foo содержит строку

Symbol name  : _foo

Итак, MinGW не генерирует префикс _imp_. Ожидается, что связать зависимое приложение не удастся, потому что Visual Studio не может найти _imp_foo.

Как правильно это сделать?

Ответы [ 2 ]

1 голос
/ 22 января 2020

Это то, что работает для меня. Я скомпилировал этот исходный код 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

Никаких подчеркиваний и импсов вообще; тем не менее, это просто сработало.

0 голосов
/ 22 января 2020

Предпочитаю вилку MinGW-w64 вместо оригинальной MinGW

Вместо

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 см. Википедия : "В ... 2013 a был запущен новый проект, MSYS2 вместе с 32-битными и 64-битными пакетами MinGW.Этот проект был создан для отслеживания новых достижений проекта Cygwin ... MSYS2 - это независимая версия MSYS, основанная на современном Cygwin (совместимость с POSIX). слой) и MinGW-w64 с целью лучшей совместимости с собственным программным обеспечением Windows. "

MinGW является зарегистрированным товарным знаком , лицензированным для проекта MinGW . Имена компиляторов в проекте MSYS2 несколько сбивают с толку: иногда они называются MinGW для краткости; исполняемые файлы имеют mingw32 в своем имени, даже если они выделены для 64 бит; официальное название, по-видимому, MinGW-w64 .

Благодаря @jacob, чье использование MinGW-w64 в его ответе обеспечило решающий сигнал.

...