1

新的 C++ 程序员在这里。我正在创建一个 QT4 应用程序,它已经足够大到我想开始使用 log4cplus 的地方。我想我很接近但 qmake 仍然不合作。

我在 Windows 机器上运行,并在 cygwin ( $ ./configure --enable-static) 下将 log4cplus 编译为静态库。

第一个问题
当我编译 log4cplus 时,我得到了两个文件。

  • liblog4cplus.a
  • liblog4cplus.dll.a

我需要包括他们两个吗?文件怎么了.dll.a

第二个问题
当我编译 moc 成功但 gcc 在尝试使用任何 log4cplus 类时失败。我不确定它是找不到头文件还是找不到实际的库。

g++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN -I"..\..\..\Qt\2010.05\qt\include\QtCore" -I"..\..\..\Qt\2010.05\qt\include\QtGui" -I"..\..\..\Qt\2010.05\qt\include" -I"external" -I"..\..\..\Qt\2010.05\qt\include\ActiveQt" -I"debug" -I"..\..\..\Qt\2010.05\qt\mkspecs\win32-g++" -o debug\qrc_tilex.o debug\qrc_tilex.cpp
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\tilex.exe object_script.tilex.Debug  -L"c:\work\workspace\tilex\lib" -L"c:\Qt\2010.05\qt\lib" -lmingw32 -lqtmaind -Lliblog4cplus.a -lQtGuid4 -lQtCored4 
./debug\main.o: In function `Z5qMainiPPc':
C:\work\workspace\tilex/main.cpp:37: undefined reference to `log4cplus::Logger::getDefaultHierarchy()'
C:\work\workspace\tilex/main.cpp:37: undefined reference to `log4cplus::BasicConfigurator::BasicConfigurator(log4cplus::Hierarchy&)'
C:\work\workspace\tilex/main.cpp:51: undefined reference to `log4cplus::BasicConfigurator::~BasicConfigurator()'
C:\work\workspace\tilex/main.cpp:51: undefined reference to `log4cplus::BasicConfigurator::~BasicConfigurator()'
mingw32-make[1]: Leaving directory `C:/work/workspace/tilex'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\tilex.exe] Error 1
mingw32-make: *** [debug] Error 2

我的项目位于C:\work\workspace\tilex.

我的目录结构是这样的:

tilex
     /lib
         /<*.a files>
     /external
              /log4cplus
                        /<header files>

我的 .pro 文件的相关部分。(我已经尝试了所有这些变量的几种排列,但仍然得到相同的结果)

INCLUDEPATH += C:\\work\\workspace\\tilex\\external
QMAKE_LIBDIR += C:\\work\\workspace\\tilex\\lib
LIBS += -Lliblog4cplus.a

我的主文件(在没有 log4cplus 的情况下编译和运行良好)。

#include "Tilex.h"
#include <QtGui>
#include <QApplication>

#include <log4cplus/logger.h>
#include <log4cplus/configurator.h>

using namespace log4cplus;

int main(int argc, char *argv[])
{
    Q_INIT_RESOURCE(tilex);
    QApplication app(argc, argv);

    // Fails
    BasicConfigurator config;
//    config.configure();
//    Logger::getInstance()
//    Logger logger = Logger::getInstance("main");
//    LOG4CPLUS_WARN(logger, "Hello, World!");
    // !

    Tilex mainWin;
    mainWin.show();
    return app.exec();
}
4

2 回答 2

1

假设其他一切都是正确的,您应该将您的 LIBS 更改为:

LIBS += -llog4cplus

-L 标志告诉 g++ 设置查找库的路径。-l 标志告诉它链接指定的库(删除 lib- 前缀和文件类型)。

如果当您说您的应用程序变得“大”时,您的意思是大小而不是复杂性,您可能想问自己为什么首先使用静态链接(查看此线程)。

于 2011-05-12T23:39:52.103 回答
0

您需要在链接行上放置两件事:

-Ldirectory\where\log4c\library\file\lives

-llog4cplus

告诉链接器将该-L目录添加到其搜索路径。-l告诉链接器查找带有lib前置和.a/或.so附加的文件。所以-lfoo告诉链接器在链接器搜索路径中寻找libfoo.a或。libfoo.so

或者,您可以直接将库的完整路径放在链接行上,而不使用任何-L-l

g++ blah blah directory\where\log4c\library\file\lives\liblog4cplus.a blah blah
于 2011-05-12T23:32:18.180 回答