Экспорт функций из кросс-статической библиотеки 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
символы в списке.