Newish C ++程序员在这里。我正在创建一个QT4应用程序,它已经足够大到我想开始使用log4cplus。我想我很接近,但qmake仍然没有合作。
我在Windows机器上运行,并且我将log4cplus编译为cygwin($ ./configure --enable-static
)下的静态库。
第一个问题
当我编译log4cplus时,我有两个文件。
我需要同时包含它们吗? .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();
}
答案 0 :(得分:1)
假设其他一切都正确,您应该将LIBS更改为:
LIBS += -llog4cplus
-L标志告诉g ++设置查找库的路径。 -l标志告诉它链接一个指定的库(删除了lib-前缀和文件类型)。
如果你说你的应用程序变得“大”,你的意思是大小而不是复杂性,你可能想问问自己为什么你首先使用静态链接(看看这个{{3} })。
答案 1 :(得分: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