QtCreator — невозможно связать статическую библиотеку (ошибка ld)

У меня возникла проблема при использовании QtCreator 3.0.1 с Qt 5.2.1 в Linux. Я пытаюсь скомпилировать свой проект, используя встроенную в QtCreator функцию сборки, которая, как мне кажется, запускает qmake project.pro, а затем make. В моем проекте используется QScintilla, которую я скомпилировал в статическую библиотеку (.a) и включил в каталог моего проекта в qscintilla/Qt4Qt5.

После завершения компиляции панель вывода компиляции показывает следующее:

/usr/bin/ld: cannot find -lqscintilla2
collect2: error: ld returned 1 exit status

Мой файл .pro содержит:

LIBS += -Lqscintilla/Qt4Qt5 -lqscintilla2

Однако запуск qmake, а затем make в корневом каталоге проекта с помощью эмулятора терминала работает отлично, и проект компилируется и компонуется успешно. Я дважды проверил, что каталог qscintilla/Qt4Qt5 содержит файл libqscintilla2.a.


person Federico    schedule 24.02.2014    source источник
comment
Вы пробовали абсолютный путь к -l, например. -lqscintilla/Qt4Qt5/libqscintilla2.a? Покажите весь вывод компоновщика, пожалуйста, что он пытается выполнить.   -  person lpapp    schedule 24.02.2014
comment
Вы также пытаетесь создать библиотеку qscintilla как часть своего проекта или просто включаете ее как статическую библиотеку? Я не вижу причин делать последнее.   -  person lpapp    schedule 24.02.2014
comment
@LaszloPapp, к сожалению, не сработало. Что мне кажется странным, так это то, что запуск make через терминал работает отлично, используя тот же файл .pro и все такое.   -  person Federico    schedule 24.02.2014
comment
Используете ли вы одни и те же папки сборки как в терминале, так и в консоли? Возможно, вы могли бы попробовать OUT_PWD в соответствии с объяснением ниже?   -  person lpapp    schedule 24.02.2014


Ответы (3)


Поскольку вы, похоже, используете Linux, было бы лучше оставить пакет с вашим дистрибутивом. Установка пакетов с добавлением статических библиотек в систему была бы более «ванильной».

Однако, если вы хотите придерживаться принципа сборки в проекте, я бы посоветовал не отключать теневую сборку и создавать другие обходные пути, имеющие свои ограничения.

Например, вы можете использовать переменную $$OUT_PWD для этой цели, но в целом вам также необходимо указать целевую зависимость между компонентами.

Итак, вы бы написали что-то вроде этого:

LIBS += -L$$OUT_PWD/qscintilla/Qt4Qt5 -lqscintilla2

Пожалуйста, отрегулируйте это в зависимости от вашего макета каталога.

person lpapp    schedule 24.02.2014
comment
Да, это лучшее решение. По какой-то причине использование OUT_PWD не работало, но _PRO_FILE_PWD_ работало (с включенной теневой сборкой). Изменить: я попытался напечатать переменные с помощью функции message() qmake, и оказалось, что PWD и _PRO_FILE_PWD_ указывают на исходный корневой каталог проекта, а OUT_PWD указывает на тот, который сгенерирован Qt. - person Federico; 24.02.2014

Вы также должны добавить строку:

PRE_TARGETDEPS += qscintilla/Qt4Qt5/libqscintilla2.a

в ваш файл .pro, чтобы статически связать библиотеку.

person Nejat    schedule 24.02.2014
comment
@LaszloPapp Что может быть лучше? Прямо сейчас я могу просто скачать последнюю версию QScintilla, сохранить ее в каталоге моего проекта, скомпилировать и скомпоновать статически. Я нахожу это очень практичным, так как могу легко заменить файлы, если автор выпустит новую версию. - person Federico; 24.02.2014

Удалось заставить это работать: в QtCreator нажмите «Проекты» на левой панели, которая откроет вкладку, позволяющую редактировать параметры сборки/запуска/стиля. В разделе «Сборка/Общие» отключите «Теневую сборку». Это создаст проект в исходном каталоге проекта.

Изменить: см. ответ @LaszloPapp для лучшего решения.

person Federico    schedule 24.02.2014
comment
Кажется, это обходной путь, но он также отключит теневые сборки. В любом случае, я все же дал +1 за вопрос. :-) - person lpapp; 24.02.2014