2012-06-03 7 views
4

Я занимаюсь разработкой приложения в Qt Creator в C++ на LinuxQT Creator - Использование внешних библиотек В My Own библиотеки

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

В библиотеке, которую я создал, я использовал другую внешнюю статическую библиотеку (libSDL.a). Я установил свою библиотеку в статическую библиотеку (* .a), и она компилируется без проблем.

Затем я добавил свою библиотеку в другое приложение и использовал некоторые из классов. При попытке скомпилировать мое приложение я получаю неопределенные ссылки из моей библиотеки для вызова функций в другую библиотеку.

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

Вот как проект библиотеки настроен в * .pro файл:

QT -= gui 
TARGET = FoobarTools 
TEMPLATE = lib 
CONFIG += staticlib 
CONFIG -= shared 
DEFINES += FOOBARTOOLS_LIBRARY 
INCLUDEPATH += ./include/SDL_Headers/ 
LIBS += -L./bin/ -lSDL 
SOURCES += ... 
HEADERS += ... 

Вот как мое приложение * .pro файл с помощью моей библиотеки:

QT -= gui 
TARGET = FoobarApp 
CONFIG += console 
CONFIG -= app_bundle 
TEMPLATE = app 
INCLUDEPATH += ./include/ 
LIBS += -L./bin/ -lFoobarTools 
SOURCES += ... 
HEADERS += ... 

ответ

-1

Я думаю, что вы можно найти ответ здесь:

http://gcc.gnu.org/ml/gcc-help/2004-04/msg00104.html

, а точнее я п этого последующее:

http://gcc.gnu.org/ml/gcc-help/2004-04/msg00106.html

я не могу проверить это прямо сейчас, но я думаю, что вероятная причина может быть возобновлена ​​следующим образом:

«Компоновщик„выбросить“библиотеку, если речь идет о через него, но ни один из символов, которые он определяет, не нужен »

В качестве первой помощи добавьте -lSDL во второй файл .pro.

Редактировать: вы уверены, что ваша статическая библиотека (первый .pro-файл) действительно использует некоторые символы из libSDL? Если нет, то компилятор просто проигнорирует файл libSDL.a и не включит его в вашу статическую библиотеку. Даже если вы используете некоторые символы из libSDL.a, только эти функции будут скопированы в исполняемый файл, тогда как другие символы не будут (по крайней мере, это то, что я думаю). «Статические библиотеки имеют специальные правила, когда дело доходит до ссылки. Объект из статической библиотеки будет добавляться только в двоичный файл, если объект предоставляет неразрешенный символ». (см .: https://stackoverflow.com/a/2649792/1284631). Затем, если ваш исполняемый файл (второй .pro-файл) использует некоторые не скопированные символы из libSDL, у вас будут ошибки. Цитируя тот же источник: «В Linux вы можете изменить это поведение с помощью опции -whole-archive linker: g ++ -Wl, - whole-archive some_static_lib.a -Wl, - no-whole-archive». Таким образом, вы убедитесь, что вы несете весь статический архив libSDL.a в своих.

1

В приложения .pro вам нужно:

INCLUDEPATH += LibraryPath (Это указывает на каталог заголовков файла.)

DEPENDPATH += LibraryPath (Это также указывает на каталог заголовков файла.)

LIBS += -LDebugOrReleasePath -lLibraryName (Это Lib-файл минус «Lib» в начале и «.a» в конце.)

После того, как это сделана проверка, если директивы #includes к пользовательской библиотеке все еще работает.

В файле .pro файла статической библиотеки вам не нужно ничего касаться, возможно, добавить CONFIG + = release.

0

И ваша библиотека, и библиотека, которую она использует, должны быть связаны в приложении.

INCLUDEPATH += ./include/SDL_Headers/ 
INCLUDEPATH += ./include/ 
LIBS += -L./bin/ -lFoobarTools 
LIBS += -L./bin/ -lSDL 
//And dont forget the Target dependencies. 
PRE_TARGETDEPS += ./libFoobarTools.a 
PRE_TARGETDEPS ./libSDL.a 

Если вы хотите узнать больше о причине библиотека компилируется, но не приложение заканчивать this question.

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