2011-05-12 60 views
1

Newish C++程序員在這裏。我正在創建一個QT4應用程序,它已經足夠大到我想要開始使用log4cplus的地方。我認爲我很接近,但qmake仍然沒有合作。在QT4應用程序中包含靜態外部庫

我在Windows機器上運行,並在cygwin($ ./configure --enable-static)下編譯log4cplus作爲靜態庫。

第一個問題
當我編譯log4cplus時,我得到了兩個文件。

  • liblog4cplus.a
  • liblog4cplus.dll.a

我需要包括他們的?什麼是.dll.a文件?

第二個問題
當我編譯MOC成功,但嘗試使用任何log4cplus類的當GCC失敗。我不確定它是否找不到頭文件或者是否找不到實際的庫。

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(); 
} 

回答

1

假設一切是正確的,你應該改變你的LIBS此:

LIBS += -llog4cplus 

-L標誌告訴g ++設置查找庫的路徑。 -l標誌告訴它鏈接指定的庫(lib-前綴和文件類型被刪除)。

如果你的意思是說你的應用程序變得越來越大,而不是複雜性,那麼你可能會問自己爲什麼你首先使用靜態鏈接(看這個thread)。

+0

-llog4cplus的工作,非常感謝你!靜態與動態鏈接帖子也很有幫助。作爲C++世界的新手,我並沒有意識到這些差異。 – LeviX 2011-05-13 17:11:25

0

你需要把兩件事情上你的鏈接線:

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

-llog4cplus 

-L通知鏈接到該目錄添加到它的搜索路徑。 -l告訴鏈接器查找lib前綴和.a.so追加文件。因此-lfoo告訴鏈接程序在鏈接程序搜索路徑中查找libfoo.alibfoo.so

或者,你可以直接把完整路徑鏈接行庫,而無需使用任何-L-l

g++ blah blah directory\where\log4c\library\file\lives\liblog4cplus.a blah blah