Экспорт функций из кросс-статической библиотеки Win32

Я попытался создать статическую библиотеку win32, используя i686-w64-mingw32 кросс-билд инструментарий.

Я построил объектные файлы и mylib.lib файл через Makefile:

$(program_RELEASE_NAME_WIN_STATIC): $(RELEASE_OBJS_WIN32_STATIC)
    i686-w64-mingw32-gcc-ar rcs $(BUILD_DIR_WIN32)/static/$@ $^

$(BUILD_DIR_WIN32)/static/%.o: %.c $(HEADERS)
    $(RELEASE_LINK_WIN32.c) $< -c -o $@

Это дало мне статическую библиотеку mylib.lib, Проверяя это на стороне Linux с nm Я могу видеть все составляющие объектные файлы и функции, которые они содержат

Нет, когда я проверяю mylib.lib на windows 10 vm, т.е.

DUMPBIN /EXPORTS mylib.lib

Я получил:

Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file mylib.lib

File Type: LIBRARY

  Summary

           C .bss
           C .data
         6AC .drectve
        5EAC .rdata
         444 .rdata$zzz
       29900 .text
          38 .text.unlikely

Ни одна из функций не экспортируется.

В соответствующем заголовочном файле я отмечаю функции, с которыми я хочу экспортировать __declspec(dllexport)

Это работало нормально, когда я создавал.dll, то есть функции, помеченные для экспорта, были единственными, которые были видны в файле.dll

Но для статического эквивалента библиотеки ничего не экспортируется?

Как вы хотите сделать функции видимыми в файле win32 .lib?

1 ответ

Решение

dumpbin /exports перечисляет символы, экспортируемые исполняемым файлом или DLL. Смотрите документацию по опциям DUMPBIN

Статическая библиотека не является исполняемым файлом или DLL. Это просто сумка объектных файлов в Unix ar формат архива (это тот же MS LIB формат).

dumpbin анализирует двоичные файлы COFF. Когда вы бежите:

dumpbin /option... static.lib

он анализирует каждый объектный файл в static.lib в соответствии с /option..., Но:

dumpbin /exports file.obj

никогда не будет сообщать об экспорте в объектном файле file.obj потому что объектный файл не является исполняемым файлом или DLL тоже. У него нет динамического стабильного символа. Только исполняемый файл или библиотека DLL могут предоставлять символы для сцепления с димамами: он поставляется со своей динамической таблицей символов, когда он генерируется компоновщиком, который не участвует в создании объектного файла или статической библиотеки.

Если вы сейчас создаете исполняемый файл или DLL, которая связывает любую функцию из вашей статической библиотеки, с которой вы прошли квалификацию __declspec(dllexport) в заголовочном файле библиотеки, компоновщик добавит эту функцию в динамическую таблицу символов выходного исполняемого файла или DLL, и если вы затем dumpbin /exports на этом исполняемом файле или DLL, вы увидите, что функция сообщается.

Объектный файл может определять глобальные символы. Глобальный символ (он же общедоступный / внешний символ) может или не может быть экспортирован для динамического связывания, в зависимости от того, квалифицирован ли он __declspec(dllexport) или нет. Символ должен быть глобальным для экспорта в DLL.

Если вы бежите dumpbin /symbols в вашей статической библиотеке, которая сообщит обо всех символах во всех объектных файлах в статической библиотеке и классифицирует их как External или же Static, Символы, которые вы квалифицировали как __declspec(dllexport) появится среди External символы в списке.

Другие вопросы по тегам