#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")
)