Я почему-то всегда думал, что переменная окружения LIB также действует и для g++/MinGW. Однако сегодня обнаружил, что это не так. А выяснил я это следующим образом. Обычно у меня есть заранее подготовленный файл типа build_qt.bat, где прописаны все переменные окружения и параметры для configure, чтобы собрать Qt. Я решил собрать Qt на работе, но мне нужны были ресурсы компьютера и я поэтому выполнил только configure без сборки всей библиотеки. Сегодня я решил уже дособрать Qt и с удивлением обнаружил, что не линкуются библиотеки OpenSSL. Как я только не изгалялся над переменной LIB, чтобы линкер его увидел ничего не помогало. Решил погуглить и выяснил, что оказывается для MinGW/g++ используется переменная LIBRARY_PATH, а не LIB. Когда я задал эту переменную, то всё пошло собираться дальше, что не могло не обрадовать. Однако в голове появилась правильная мысль: почему на системе где стоят библиотеки MSXML и глобально прописана переменная LIB с путем до этой самой мелкософтовской библиотеки Qt линковаться отказывается. И тут до меня дошло, что configure Qt насильно выдирает путь из переменной LIB, которую подставляет в линкер через параметр -L"" и это при том, что он явно знает каким компилятором он будет собирать библиотеку. Отсюда получается, что в configure есть баг/недоработка, т.к. он не учитывает, что переменная LIB и INCLUDE никаким образом не относятся к компилятору g++/MinGW, а относятся только к компилятору Microsoft. С MinGW вместо этих двух переменных нужно использовать переменные LIBRARY_PATH для указания пути, где лежат файлы библиотек (.a), а для инклудов/хедеров/заголовков (.h, .hpp) нужно использовать CPLUS_INCLUDE_PATH.
Сначала я хотел убрать любое упоминание о LIB и INCLUDE из своих командных файлов с окружением для MinGW, а потом понял, что это не излечит "багу" qt и поэтому остановился на таком варианте:
set LIB=
set INCLUDE-
set LIBRARY_PATH=c:\path\to\openssl\for\example
set CPLUS_INCLUDE_PATH=c:\path\to\openssl\include\for\example
как-то мне вообще в голову не приходило, что компиллери конфигуратор могут смотреть переменные окружения, кроме PATH и HOME
Да этот configure злой вообще, вот метод из configureapp.cpp:
QString Configure::locateFile( const QString &fileName )
{
QString file = fileName.toLower();
QStringList paths;
#if defined(Q_OS_WIN32)
QRegExp splitReg("[;,]");
#else
QRegExp splitReg("[:]");
#endif
if (file.endsWith(".h"))
paths = QString::fromLocal8Bit(getenv("INCLUDE")).split(splitReg, QString::SkipEmptyParts);
else if ( file.endsWith( ".lib" ) )
paths = QString::fromLocal8Bit(getenv("LIB")).split(splitReg, QString::SkipEmptyParts);
else
paths = QString::fromLocal8Bit(getenv("PATH")).split(splitReg, QString::SkipEmptyParts);
return locateFileInPaths(file, paths);
}
Написал, только теперь меня мучают сомнения. Все-таки в коде идет проверка на расширение файла ".lib" и только в этом случае берется путь из LIB. То, что INCLUDE берется для всех .h файлов конечно не правильно. Однако INCLUDE вроде бы не влияло на сборку. Я похоже что-то упустил...
Объяснения не написали. Thiago отrejectил и только такой коммент оставил:
set LIB=
set INCLUDE=
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)