Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Переменные LIB и LIBRARY_PATH

Автор: SABROG 23.1.2010, 13:33

Я почему-то всегда думал, что переменная окружения 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

Автор: Litkevich Yuriy 23.1.2010, 15:17

как-то мне вообще в голову не приходило, что компиллери конфигуратор могут смотреть переменные окружения, кроме PATH и HOME

Автор: SABROG 23.1.2010, 16:04

Да этот 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", в этом методе сделано всё для MSVC и совершенно не учитываются особенности MinGW, т.е. ".a" библиотек как будто не существует.

Автор: Litkevich Yuriy 23.1.2010, 16:17

Цитата(SABROG @ 23.1.2010, 19:04) *
Особенно стоит обратить внимание на ".lib"
SABROG, пиши рапорт тролям. И приведи этот фрагмент кода.

Автор: SABROG 23.1.2010, 18:12

Написал, только теперь меня мучают сомнения. Все-таки в коде идет проверка на расширение файла ".lib" и только в этом случае берется путь из LIB. То, что INCLUDE берется для всех .h файлов конечно не правильно. Однако INCLUDE вроде бы не влияло на сборку. Я похоже что-то упустил...

Автор: Litkevich Yuriy 23.1.2010, 19:36

Цитата(SABROG @ 23.1.2010, 21:12) *
только теперь меня мучают сомнения
ну ничё, напишут объяснение, ежели ты не прав

Автор: SABROG 25.1.2010, 22:34

Объяснения не написали. Thiago отrejectил и только такой коммент оставил:

Цитата
Please clean up your environment. Never mix different compiler settings.

The contents of INCLUDE and LIB are used to tell Qt where to find headers and libraries.


Вольный перевод такой: пожалуйста очистите ваше окружение (вероятно он о друзьях и родных ;) )
Никогда не смешивайте настройки разных компиляторов. Содержимое INCLUDE и LIB используется чтобы сказать Qt где искать заголовки и библиотеки.

Собственно с чего начали к тому и вернулись:

set LIB=
set INCLUDE=


Пойду ему ответ оставлю, что они сами миксуют эти settings ибо INCLUDE и LIB используются совместно и Qt и MSVC.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)