2012-06-03 35 views
4

我在Linux上Qt Creator的 - 使用外部库在我自己的图书馆

我创造我自己的图书馆,这样我可以在整个一组应用程序使用一些通用类开发Qt Creator中C中的应用++。

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

,更准确地说我n这个后续:

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文件在您的内部。

1

在应用程序的需要的.pro:

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

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

LIBS += -LDebugOrReleasePath -lLibraryName(这是LIB文件名减去“LIB”开头和“.A”结尾。)

一旦这样做了检查#包括您的自定义库仍在工作。

在你不需要接触任何静态libary的.pro文件,可能添加“CONFIG + =释放”。

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的原因。

相关问题