1

ここに新しいC++プログラマーがいます。QT4アプリケーションを作成していますが、log4cplusの使用を開始するのに十分な大きさになっています。私は近いと思いますが、qmakeはまだ協力していません。

私はWindowsマシンで実行しており、log4cplusをcygwin($ ./configure --enable-static)の下で静的ライブラリとしてコンパイルしました。

最初の質問
log4cplusをコンパイルしたとき、2つのファイルを取得しました。

  • liblog4cplus.a
  • liblog4cplus.dll.a

両方を含める必要がありますか?.dll.aファイルとは何ですか?

2番目の質問
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();
}
4

2 に答える 2

1

他のすべてが正しいと仮定すると、LIBSを次のように変更する必要があります。

LIBS += -llog4cplus

-Lフラグは、ライブラリを検索するためのパスを設定するようにg++に指示します。-lフラグは、指定されたライブラリをリンクするように指示します(lib-プレフィックスとファイルタイプが削除されています)。

アプリケーションが「大きく」なっていると言っているときに、複雑さではなくサイズが大きいことを意味する場合は、そもそも静的リンクを使用している理由を自問することをお勧めします(このスレッドを参照してください)。

于 2011-05-12T23:39:52.103 に答える
0

リンクラインに2つのものを配置する必要があります。

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

-llog4cplus

-L、そのディレクトリを検索パスに追加するようにリンカに指示します。は、先頭に追加または追加さ-lれたファイルを探すようにリンカーに指示します。したがって、リンカーに、またはリンカー検索パスを検索するように指示します。lib.a.so-lfoolibfoo.alibfoo.so

-Lまたは、または-l:を使用せずに、ライブラリへのフルパスをリンク行に直接配置することもできます。

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