簡體   English   中英

在QT4應用程序中包括靜態外部庫

[英]Include static external library in QT4 application

這里是新的C ++程序員。 我正在創建一個QT4應用程序,它已經足夠大到我想開始使用log4cplus的地方。 我想我已經接近了,但是qmake仍然沒有合作。

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

第一個問題
當我編譯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();
}

假設其他所有內容都正確,則應將LIBS更改為此:

LIBS += -llog4cplus

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

如果說應用程序正在變大時,如果您指的是大小而不是復雜性,那么您可能想問自己為什么首先使用靜態鏈接(請看此線程 )。

您需要在鏈接行上放置兩件事:

-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM