Цель предупреждения —enable-auto-import

#c #linker #mingw

#c #компоновщик #mingw

Вопрос:

Я пытаюсь скомпилировать следующую программу:

 #include <iostream>
int main(){
    std::cout << "Hello, world!";
    return 0;
}
  

Когда я его компилирую, я получаю это сообщение:

 C:programs>g   test.cpp
Info: resolving std::cout  by linking to __imp___ZSt4cout (auto-import)
c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: warning: a
uto-importing has been activated without --enable-auto-import specified on the c
ommand line.
This should work unless it involves constant data structures referencing symbols
 from auto-imported DLLs.
  

Сборка завершается успешно, и исполняемый файл запускается, как и ожидалось, но это предупреждение по-прежнему меня раздражает. Я ожидаю, что успешная сборка будет полностью бесшумной. Это сообщение создает ложное впечатление, что с моим кодом что-то не так.

Я могу отключить эту ошибку g -Xlinker --enable-auto-import test.cpp , но это нежелательно, так как утрояет количество символов, которые мне нужно ввести для компиляции программы.

Вопросы:

  • Почему это предупреждение появляется для простейших программ? я не ожидаю загадочных предупреждений при компиляции Hello World.
  • Можно ли отключить это предупреждение, не передавая флаг компоновщику каждый раз? Возможно, опция в файле конфигурации, скрытом где c:mingw -то внутри? Или, может быть, я пропустил флажок «автоматически включать автоимпорт» во время установки?

Возможно, соответствующие спецификации

  • Версия GCC 4.5.0
  • ld.exe Версия 2.20.51.20100613
  • Windows XP с пакетом обновления 3

Ответ №1:

Раньше я сталкивался с той же проблемой, что и вы g . Я только что решил эту раздражающую проблему. Вот как я прихожу к решению, шаг за шагом:

В Windows вы можете создать псевдоним g со всеми заданными параметрами, с которыми вы хотите использовать g . Скажем, например, вы хотите создать псевдоним s g -enable-auto-import , затем вы запускаете это cmd как:

 C:>doskey s  =g   -enable-auto-import
  

Это создает вызываемый псевдоним s . Но этот псевдоним не будет принимать никаких аргументов командной строки, что означает, что вы не можете написать это:

 C:>s   filename.cpp //it is not working
  

Чтобы заставить его работать, если вы должны указать псевдониму принимать аргументы командной строки при его создании, вот как это делается:

 C:>doskey s  =g   -enable-auto-import $*
  

Пожалуйста, обратите внимание $* на справа, который указывает, что теперь s может принимать аргумент командной строки:

 C:>s   filename.cpp //yayyyy..its working now, without giving any warnings!
  

Но вы можете не захотеть создавать псевдоним при каждом открытии cmd . В этом случае вы можете создать ярлык cmd .

Например, я создал ярлык с именем Console и в Target текстовом поле окна ярлыка я написал следующее:

 C:WINDOWSSystem32cmd.exe /K doskey s  =g   -enable-auto-import $*
  

И поскольку это слишком длинно (по горизонтали), один снимок экрана не смог захватить всю команду. Я сделал два скриншота, чтобы вы могли сами увидеть, как я это сделал:

  • Левая часть команды

    Левая часть команды

  • Правая часть команды

    Правая часть команды

Дополнительные сведения о создании псевдонимов в Windows см. В этом:

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

1. Некоторые системы сборки не запускают процесс через оболочку.

Ответ №2:

Я немного прочитал, и похоже, что это может быть связано с библиотекой DLL mingw32, в которой не определены атрибуты dllimport.

Возможно, есть исправление или вы можете самостоятельно перестроить mingw32 и добавить их?

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

1. Я сам провел некоторое исследование, и я согласен с вами. Вот обсуждение из группы новостей binutils о том, почему появляется ошибка (я думаю, это слишком технически для меня). Похоже, это список изменений, в котором они исправляют его, чтобы --enable-auto-import он передавался автоматически. Я не уверен, использовал ли я компоновщик 2-летней давности, но я переустановил MinGW, и предупреждение исчезло.