这是我第二天试图嫁给Qt5,MinGW和log4cxx。
即使在我成功编译了所有内容之后,链接了apr,apr-util和log4cxx库,ld
也给了我一堆“未定义的引用”问题。
看起来在log4cxx编译期间指定了不同的设置(我正在使用ant)。 有人能够成功编译并使用min4W的log4cxx吗?
环境:
我做了什么:
现在,当我尝试链接我的项目时,我正在接下来:
*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库中声明和定义的函数。
有没有办法进一步分析问题,看看为什么会发生这种情况?
答案 0 :(得分:1)
我将描述您遇到的第一个问题并为其提供解决方案。如果它无法解决您的问题,不会因为那只是修复过程的第一步而回复,只要您提供相关反馈,我会逐步扩展答案以解决更多问题每次修复,直到我们最终确定它。所以,让我们开始。
首先,您以错误的方式将库添加到LIBS
变量中。你有两个选择:
LIBS += $${PWD}/../log4cxx/lib/libapr-1.a
LIBS += $${PWD}/../log4cxx/lib/libaprutil-1.a
LIBS += $${PWD}/../log4cxx/lib/liblog4cxx-1.a
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
答案 1 :(得分:1)
您需要注意正确的链接顺序: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
文件是最简单的。