Эквивалент #pragma comment (библиотека, «xxx.lib») под Linux?

#c #winapi #undefined

#gcc #статическое связывание

Вопрос:

У меня есть файл статической библиотеки с именем libunp.a , я знаю, что мог бы использовать gcc -lunp xx для ссылки на библиотеку.

Я мог бы использовать #pragma comment(lib,"xxx.lib") , чтобы указать компилятору Microsoft C / C включить библиотеку; как я мог бы это сделать под Linux / GCC?

Комментарии:

1. Кстати, для этого был запрос функции: gcc.gnu.org/bugzilla/show_bug.cgi?id=39437

Ответ №1:

Похоже, что на странице руководства GCC по прагмам нет упоминания о каких-либо эквивалентных прагмах.Руководство GCC по прагмам.

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

Комментарии:

1. То же самое относится к некоторым, если не ко всем компиляторам Windows. Но да, такие программы плохие

2. «правильная компиляция зависит от порядка ссылок». — Нет, как указано в связанной статье, правильная КОМПОНОВКА зависит от порядка ссылок.

3. Зависимость от порядка иногда полезна для компоновки, но она не должна запрещать указывать что-либо, фактически не зависящее от какого-либо конкретного порядка компоновки (за исключением порядка в системных библиотеках, которые всегда появляются позже). В частности, по этой причине просто глупо исключать случаи только с одной внешней библиотекой. Обычно это неуместно для пользователей C / C , поскольку это все равно что сказать: «Эй, нам не нравится неопределенное / неуказанное поведение, поэтому давайте сделаем все их четко определенными!»

Ответ №2:

Библиотеки должны быть указаны на этапе компоновки. Такая информация просто не принадлежит единице перевода. Модуль перевода может быть предварительно обработан, скомпилирован и собран даже без этапа компоновки.

Просто потому, что #pragma comment(lib,"xxx.lib") находится в исходном файле, не означает, что компилятор использует его. Фактически, он вводится как комментарий и впоследствии используется компоновщиком. Не сильно отличается от * nix.

Комментарии:

1. Вы не совсем правы, есть некоторые случаи, например, использование ROOT (root.cern.ch ) где это может быть очень полезно.

2. OP уже ясно понял, что компоновщик GCC не понимает эту прагму. Это никоим образом не отвечает на вопрос.

Ответ №3:

Используйте этот флаг GCC для генерации ошибки для неизвестных прагм. Он быстро сообщит вам, понимает ли это компилятор.

-Werror=unknown-pragmas

Комментарии:

1. Этот ответ не отвечает на вопрос.

2. … и нет, GCC 9.2 или clang 8 по-прежнему не понимают эту прагму (например, warning: ignoring #pragma comment [-Wunknown-pragmas] \ #pragma comment(lib,"xxx.lib") )