#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, и предупреждение исчезло.