QT Creator - 在我自己的库中使用外部库

时间:2012-06-03 12:02:08

标签: c++ linux qt

我正在用Linux上的c ++在QT Creator中开发一个应用程序

我创建了自己的库,以便在一组应用程序中使用一些公共类。

在我创建的库中,我使用了另一个外部静态库(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 += ...

3 个答案:

答案 0 :(得分:1)

在应用程序的.pro中,您需要:

INCLUDEPATH += LibraryPath(这指向标题文件的目录。)

DEPENDPATH += LibraryPath(这也指向头文件的目录。)

LIBS += -LDebugOrReleasePath -lLibraryName(这是lib-filename减去' lib'在开头和' .a'在结尾。)

完成后,请检查自定义库中的#include是否仍然有效。

在静态图书馆的.pro文件中,您不需要触摸任何内容,也可以添加“CONFIG + = release'。

答案 1 :(得分:1)

您的图书馆和它使用的图书馆都应该在应用程序中链接。

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

答案 2 :(得分:-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链接器选项更改该行为:g ++ -Wl, - whole-archive some_static_lib.a -Wl, - no-whole-archive”。这样,您就可以确保在您的内容中携带整个静态libSDL.a存档。