2014-09-07 3 views
1

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

Поскольку это проект подпроекта, я указал порядок, в котором построены две части. Начиная с статической библиотеки в дереве проекта, а затем в приложении в дереве проекта. Выполнен с помощью опции CONFIG + =.

Мне также нужна третья внешняя статическая библиотека. Который находится в отдельной директории в моей системе.

Таким образом, для обоих подпроектов добавить следующее оба .pro файлов:

INCLUDEPATH += /local/yrq12edu/local/bpp/dev/include 
LIBS += -L/local/yrq12edu/local/bpp/dev/lib -lbpp-seq -lbpp-core 

Тогда для приложения подпроекта Я использовал мастера добавления библиотеки связать библиотеку, которая находится в дереве проекта ,

Я написал очень простой графический интерфейс с несколькими надписями и меню «Файл», чтобы проверить, что все работает.

Нажатие кнопки зеленого запуска приводит к успешному запуску приложения, и тестовая функциональность работает хорошо.

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

error while loading shared libraries: libbpp-seq.so.9: cannot open shared object file: No such file or directory 

У меня возникли проблемы с пониманием, как это .so являются общими для объектов, я бы подумал, что было бы .а для статического файла, я тоже запутался почему работа с Green Arrow «Run» в Qt Creator будет работать и запускать программу, но при попытке выполнить исполняемый файл в приведенной выше ошибке. Есть что-то еще, что мне нужно сделать?

EDIT:

Библиотека третья сторона сообщает, как связать либо динамически или статически с г ++ командует.

Dynamic Рычажный:

g++ biohello.cpp \ 
    -o biohello \ 
    -I$bpp_dir/include \ 
    -L$bpp_dir/lib \ 
    -lbpp-seq -lbpp-core 

Статическая Связь:

g++ biohello.cpp \ 
    -o biohello \ 
    --static \ 
    -I$bpp_dir/include \ 
    -L$bpp_dir/lib \ 
    -lbpp-popgen -lbpp-phyl -lbpp-seq -lbpp-core 
strip biohello 

Я был в состоянии статически связать библиотеки для программ командной строки со второй командой G ++. Я бы хотел добиться того же, но с Qt Creator для GUI-приложения.

UPDATE:

Удаление двух линий, используемых:

INCLUDEPATH += /local/yrq12edu/local/bpp/dev/include 
LIBS += -L/local/yrq12edu/local/bpp/dev/lib -lbpp-seq -lbpp-core 

из обоих .pro файлов и попытки мастера добавления библиотеки, чтобы добавить файлы .a извне, в результате добавления:

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../local/bpp/dev/lib/release/ -lbpp-seq 
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../local/bpp/dev/lib/debug/ -lbpp-seq 
else:unix: LIBS += -L$$PWD/../../local/bpp/dev/lib/ -lbpp-seq 

INCLUDEPATH += $$PWD/../../local/bpp/dev/include 
DEPENDPATH += $$PWD/../../local/bpp/dev/include 

win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/release/libbpp-seq.a 
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/debug/libbpp-seq.a 
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/release/bpp-seq.lib 
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/debug/bpp-seq.lib 
else:unix: PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/libbpp-seq.a 

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../local/bpp/dev/lib/release/ -lbpp-core 
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../local/bpp/dev/lib/debug/ -lbpp-core 
else:unix: LIBS += -L$$PWD/../../local/bpp/dev/lib/ -lbpp-core 

INCLUDEPATH += $$PWD/../../local/bpp/dev/include 
DEPENDPATH += $$PWD/../../local/bpp/dev/include 

win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/release/libbpp-core.a 
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/debug/libbpp-core.a 
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/release/bpp-core.lib 
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/debug/bpp-core.lib 
else:unix: PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/libbpp-core.a 

к .pro файлов, но затем нажать Run результатов в error while loading shared libraries: libbpp-seq.so.9: cannot open shared object file: No such file or directory

Я не пытался включить файлы .so, только.файлы с помощью Add Library Wizard: S

+0

Попытайтесь также добавить 'PRE_TARGETDEPS + =/local/yrq12edu/local/bpp/dev/lib/libbpp-seq.a' и' PRE_TARGETDEPS + =/local/yrq12edu/local/bpp/dev/lib/libbpp- core.a' – Nejat

ответ

1

Если вы не создаете исполняемый GUI как статическую программу, он может использовать статические библиотеки и динамически загружать (.so). Поэтому я собрал созданную вами библиотеку, статически связанную, а сторонняя сторона (libbpp) была динамичной.

Для создания статического исполняемого файла требуется, чтобы все библиотеки также были связаны статически. Поэтому, если у вас установлена ​​статическая библиотека для libppp, вы сможете создать статическое приложение QT (предполагая, что это поддерживаемый тип проекта в QT).

Что касается сообщения об ошибке общего объекта. Если вы хотите, чтобы ваше приложение для запуска вне QT ваш придется добавить что-то вроде этого, чтобы /etc/ld.conf

/local/yrq12edu/local/bpp/dev/lib 

Это добавляет путь библиотек BPP для динамического поиска загрузчика пути. После внесения изменений в /etc/ld.conf вам нужно запустить эту команду:

ldconfig 

Я не знаю внутреннюю работу QT, но это скорее всего работает, потому что за кулисами он вручную добавляет/местные/yrq12edu/местные/BPP/dev/lib к пути поиска для объектов библиотеки (без изменения /etc/ld.conf)

В частности, компиляция исполняемого файла как -static приведет к ошибкам, если вы пытаетесь динамически загружать что-либо во время ссылки. Чтобы получить полностью статичный бинарный файл, вам нужно использовать статическую версию runtimes (c/C++). С помощью GCC вы можете принудительно использовать статическое время C с -static-libgcc и с использованием C++ -static-libstdc++.

Смежные вопросы