QT Creator-在我自己的库中使用外部库 我在Linux上开发了一个应用程序,在C++上

QT Creator-在我自己的库中使用外部库 我在Linux上开发了一个应用程序,在C++上,c++,linux,qt,C++,Linux,Qt,我创建了自己的库,这样我就可以在一组应用程序中使用一些公共类 在我创建的库中,我使用了另一个外部静态库(libSDL.a)。 我已将我的库配置为静态库(*.a),并且它可以顺利编译 然后,我将我的库添加到另一个应用程序中,并使用了一些类。当试图编译我的应用程序时,我从我的库中得到未定义的引用,以调用其他库的函数 据我所知,静态库应该在编译过程中复制。为什么我要获取对库的未定义引用,而这些引用应该复制到我的库中 以下是如何在*.pro文件中配置库项目: QT -= gui TARGET = Foo

我创建了自己的库,这样我就可以在一组应用程序中使用一些公共类

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

我想你可以在这里找到答案:

更准确地说,在后续行动中:

我现在无法测试,但我认为可能的原因可能是:

如果链接器遇到库,但不需要它定义的任何符号,它将“丢弃”库

作为急救帮助,将-lSDL添加到第二个.pro文件中


编辑:您确定静态库(第一个.pro文件)确实使用了libSDL中的一些符号吗?如果没有,那么编译器只会忽略libSDL.a文件,而不会将其包含在静态库中。即使使用libSDL.a中的一些符号,也只会将这些函数复制到可执行文件中,而其他符号不会(至少我是这么认为的)。“静态库在链接时有特殊规则。只有当静态库中的对象提供未解析的符号时,才会将该对象添加到二进制文件中。”(请参阅:)。然后,如果您的可执行文件(第二个.pro文件)使用了一些未从libSDL复制的符号,则会出现错误。引用同一来源:“在Linux上,您可以使用--whole-archive链接器选项来更改该行为:g++-Wl,--whole-archive some_static_lib.a-Wl,--no-whole-archive”。通过这种方式,您可以确保将整个静态libSDL.a存档放在自己的.pro中。

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

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

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

LIBS+=-LDebugOrReleasePath-lLibraryName
(这是lib文件名减去开头的'lib'和结尾的'.a'

完成后,检查自定义库的#includes是否仍在工作


在静态库的.pro文件中,您不需要触摸任何东西,可以添加'CONFIG+=release'。

应用程序中应链接您的库及其使用的库

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
如果您想了解更多关于库编译而不是应用程序编译的原因,请签出