【问题标题】:How to solve undefined reference errors when linking log4cxx in qmake projectqmake项目中链接log4cxx时如何解决未定义的引用错误
【发布时间】:2013-04-09 07:03:14
【问题描述】:

这是我尝试与 Qt5、MinGW 和 log4cxx 结婚的第二天。

即使我已经成功编译了所有内容,链接了 apr、apr-util 和 log4cxx 库,ld 还是给了我一堆“未定义引用”的问题。

看起来在 log4cxx 编译期间指定了不同的设置(我使用的是 ant)。 有没有人能够成功编译并使用带有 MinGW 的 log4cxx?

环境:

  • log4cxx 中继
  • 4 月 1.4.6 日
  • apr-util 1.5.2
  • 最新MinGW
  • 我正在使用带有最新 MinGW 的 Qt 5 作为编译器

我做了什么:

  • 使用 ant 使用以下命令编译 log4cxx:“ant -Dcompiler=gcc -Dfind=false -DLOG4CXX_STATIC=1 -Dlib.type=static"
  • 在 pro 文件中将结果库添加到我的项目中:“LIBS += -L../log4cxx/lib LIBS += -llibapr-1 -llibaprutil-1 -lliblog4cxx"

现在,当我尝试链接我的项目时,我得到了下一个:

*C:/mingw/bin/mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory 'C:/Work/SPP_Development/AutoHaul/Sub-systems/TCS/Source/build-SimulatorEngine-Standalone_MinGW-Debug'
g++ -Wl,-subsystem,windows -mthreads -o debug\SimulatorEngine.exe object_script.SimulatorEngine.Debug  -lmingw32 -lqtmaind -L../log4cxx/lib -llibapr-1 -llibaprutil-1 -lliblog4cxx -LC:\Qt\Qt5.0.1\5.0.1\mingw47_32\lib -lQt5XmlPatternsd -lQt5Widgetsd -lQt5Networkd -lQt5Xmld -lQt5Guid -lQt5Cored -llibEGLd -llibGLESv2d -lgdi32 -luser32 
Makefile.Debug:200: recipe for target 'debug\SimulatorEngine.exe' failed
mingw32-make[1]: Leaving directory 'C:/Work/SPP_Development/AutoHaul/Sub-systems/TCS/Source/build-SimulatorEngine-Standalone_MinGW-Debug'
Makefile:34: recipe for target 'debug' failed
../log4cxx/lib/liblog4cxx.lib(mutex.o): In function `ZN7log4cxx7helpers5MutexC2ERNS0_4PoolE':
c:/Work/log4cxx/apache-log4cxx-trunc/src/main/cpp/mutex.cpp:35: undefined reference to `apr_thread_mutex_create@12'
../log4cxx/lib/liblog4cxx.lib(mutex.o): In function `ZN7log4cxx7helpers5MutexC2EP10apr_pool_t':
c:/Work/log4cxx/apache-log4cxx-trunc/src/main/cpp/mutex.cpp:45: undefined reference to `apr_thread_mutex_create@12'
../log4cxx/lib/liblog4cxx.lib(mutex.o): In function `ZN7log4cxx7helpers5MutexD2Ev':
c:/Work/log4cxx/apache-log4cxx-trunc/src/main/cpp/mutex.cpp:55: undefined reference to `apr_thread_mutex_destroy@4'*

无论出于何种原因,log4cxx 库似乎都找不到在 apr 库中声明和定义的函数。

有没有办法进一步分析问题,看看为什么会这样?

【问题讨论】:

  • Qt 与 log4cxx 无关,反之亦然。未定义的引用会导致您无法正确链接到 Qt 或 log4cxx。从您当前的帖子中,不清楚您获得了哪些符号的未定义引用。使用链接器输出扩展您的问题以获得更多帮助。
  • 你说得对,应该提供更多细节。原始问题已更新。

标签: qt mingw qmake log4cxx


【解决方案1】:

我将描述您遇到的第一个问题并给出解决方案。如果它不能解决您的问题,不要回复,因为那只是修复过程的第一步,只要您提供相关反馈,我将逐步扩大答案以解决更多问题每次修复,直到我们最终确定为止。那么,让我们开始吧。

首先,您以错误的方式将库添加到LIBS 变量中。您有 2 个选择来做正确的事:

#1

LIBS += $${PWD}/../log4cxx/lib/libapr-1.a
LIBS += $${PWD}/../log4cxx/lib/libaprutil-1.a
LIBS += $${PWD}/../log4cxx/lib/liblog4cxx-1.a

#2

LIBS += -L$${PWD}/../log4cxx/lib
LIBS += -lapr-1
LIBS += -laprutil-1
LIBS += -llog4cxx-1

注意:当然也可以使用一个班轮:

LIBS += -L$${PWD}/../log4cxx/lib -lapr-1 -laprutil-1 -llog4cxx-1

注意:也可以使用续行 (\) 来提高可读性:

LIBS += -L$${PWD}/../log4cxx/lib \
        -lapr-1                  \
        -laprutil-1              \
        -llog4cxx-1

【讨论】:

    【解决方案2】:

    您需要注意正确的链接顺序:liblog4cxx 依赖于libapr*,因此libapr 条目需要在之后 liblog4cxx

    LIBS += -L../log4cxx/lib \
            -llog4cxx-1 \
            -lapr-1 \
            -laprutil-1
    

    原因是依赖关系是从左到右解析的,因此在您的情况下,当 log4cxx 出现时,apr 库已被读取并被遗忘,其中包含一些需要解析的外部符号。 ld 不会再读取 apr 库(与循环依赖问题和历史原因有关)。

    要测试这是否有效,您可以尝试运行命令

    g++ -Wl,-subsystem,windows -mthreads -o debug\SimulatorEngine.exe object_script.SimulatorEngine.Debug  -lmingw32 -lqtmaind -L../log4cxx/lib -lliblog4cxx -llibapr-1 -llibaprutil-1 -LC:\Qt\Qt5.0.1\5.0.1\mingw47_32\lib -lQt5XmlPatternsd -lQt5Widgetsd -lQt5Networkd -lQt5Xmld -lQt5Guid -lQt5Cored -llibEGLd -llibGLESv2d -lgdi32 -luser32
    

    从目录

    C:/Work/SPP_Development/AutoHaul/Sub-systems/TCS/Source/build-SimulatorEngine-Standalone_MinGW-Debug
    

    首先是你自己。但也许只是修改.pro 文件是最简单的。

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 2014-10-07
      相关资源
      最近更新 更多