【问题标题】:QT Creator - Using External Libraries Within My Own LibraryQT Creator - 在我自己的库中使用外部库
【发布时间】:2012-06-07 20:49:07
【问题描述】:

我正在 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 += ...

【问题讨论】:

    标签: c++ linux qt


    【解决方案1】:

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

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

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

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

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

    在静态库的 .pro 文件中,您无需触摸任何内容,可以添加“CONFIG += release”。

    【讨论】:

      【解决方案2】:

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

      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

      【讨论】:

        【解决方案3】:

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

        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 存档。

        【讨论】:

          猜你喜欢
          • 2011-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 2018-05-02
          相关资源
          最近更新 更多