Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何解决qmake项目中链接log4cxx时未定义的引用错误_Qt_Mingw_Qmake_Log4cxx - Fatal编程技术网

Qt 如何解决qmake项目中链接log4cxx时未定义的引用错误

Qt 如何解决qmake项目中链接log4cxx时未定义的引用错误,qt,mingw,qmake,log4cxx,Qt,Mingw,Qmake,Log4cxx,这是我第二天要和Qt5、MinGW和log4cxx结婚了 即使在我成功编译了所有内容之后,链接了apr、apr util和log4cxx库,ld也给了我一大堆“未定义的引用”问题 看起来在log4cxx编译期间指定了不同的设置(我使用的是ant)。 是否有人能够成功编译并使用带有MinGW的log4cxx 环境: log4cxx主干 4月1日4月6日 4月1.5.2日 最新消息 我使用qt5和最新的MinGW作为编译器 我所做的: 使用ant和以下命令编译log4cxx:“ant -Dco

这是我第二天要和Qt5、MinGW和log4cxx结婚了

即使在我成功编译了所有内容之后,链接了apr、apr util和log4cxx库,
ld
也给了我一大堆“未定义的引用”问题

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

环境:

  • log4cxx主干
  • 4月1日4月6日
  • 4月1.5.2日
  • 最新消息
  • 我使用qt5和最新的MinGW作为编译器
我所做的:

  • 使用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库中声明和定义的函数


有没有办法进一步分析问题,看看为什么会发生这种情况?

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

首先,将库以错误的方式添加到
LIBS
变量中。您有两种选择来正确操作:

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

LIBS += -L$${PWD}/../log4cxx/lib -lapr-1 -laprutil-1 -llog4cxx-1
LIBS += -L$${PWD}/../log4cxx/lib \
        -lapr-1                  \
        -laprutil-1              \
        -llog4cxx-1
注意:也可以使用行延续(
\
)来提高可读性:

LIBS += -L$${PWD}/../log4cxx/lib -lapr-1 -laprutil-1 -llog4cxx-1
LIBS += -L$${PWD}/../log4cxx/lib \
        -lapr-1                  \
        -laprutil-1              \
        -llog4cxx-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
文件是最简单的。

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