Эквивалент импортных библиотек в Linux - PullRequest
0 голосов
/ 09 декабря 2018

В Windows C ++, когда вы хотите связать с DLL, вы должны предоставить библиотеку импорта.Но в системе сборки GNU, когда вы хотите ссылаться на .so файлы, которые эквивалентны dll, вы этого не делаете.Почему это?Существует ли эквивалент библиотек импорта Windows.

Примечание. Я не говорю о случае, когда вы используете GNU C ++ в Windows, где вам также необходимо использовать библиотеки импорта.Разграничение между Windows C ++ и Linux C ++.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Чтобы добавить ответ Basile, вам иногда могут понадобиться библиотеки импорта в Linux для имитации задержки загрузки общих библиотек (что полезно, например, если ваше приложение редко нуждается в этой библиотеке и вы не хотите тратить впустую)ресурсы на него).

Такие имитированные библиотеки импорта будут состоять из набора оболочек, которые вызывают внутренние вызовы dlopen и dlsym, а затем переходят к реализации в разделяемой библиотеке.Они могут быть реализованы вручную, с помощью сценария для конкретного проекта или с помощью универсального инструмента Implib.so .

0 голосов
/ 09 декабря 2018

Модель связывания отличается в Windows и в Linux .Прочитайте книгу Левина Компоновщики и загрузчики (в Linux каждый публичный символ из библиотеки экспортируется, если только вы не играете видимость трюки, в Windows это не так, и экспортируемые символы должны быть объяснены).

Стандарт C ++ 11 (читать n3337 ) не упоминайте динамические ссылки.Это деталь реализации.

Будущее C ++ 20 может иметь модулей .

Нет "библиотек импорта"в Linux.

Для получения более подробной информации, помните, что искажение имени отличается.Читайте также Руководство по программной библиотеке , Drepper's Как писать общие библиотеки

В Linux, плагины загружаются (и обрабатываются иначе , чем в Windows) динамическим загрузчиком .См. ld-linux (8) , dlopen (3) , dlsym (3) , elf (5)

Проверка в Linux файлов ELF ( объектные файлы , библиотеки , исполняемые файлы ) с помощью objdump (1) и readelf (1) и nm (1) .

См. Также C ++ dlopen mini howto .Читайте также об атрибуте Visibility .См. Также этот вопрос.

.so файлы, которые эквивалентны dll

Linux общий объект (*Файл 1091 * ELF .so) не совсем эквивалентен для Windows DLL .Прочитайте ссылки, приведенные выше.

Я также рекомендую прочитать Операционные системы: три простых компонента и старые Расширенное программирование Linux (оба доступны для бесплатной загрузки).Позже прочитайте syscalls (2) и страницы, на которые есть ссылки.

Также помните, что Linux является свободным программным обеспечением , так что вы можете скачать и изучить исходный кодбольшинство его компонентов.

PS.Linux и Windows действительно разные.Не ожидайте найти в Linux точный эквивалент каждой функции Windows. Взгляните на Linux свежим взглядом. Воспользуйтесь преимуществами того, что Linux сделан из свободного программного обеспечения, и подумайте над изучением исходного кода, например, kernel , binutils , GNU libc или musl-libc (оба предоставляют несколько ld-linux.so и libc.so, поэтому стандартная библиотека C ), GCC или Clang (оба предоставляют стандартную библиотеку C ++ выше libc.so).

...