سؤال

جديدين C++ مبرمج هنا.أنا خلق QT4 التطبيق وانها حصلت كبيرة بما فيه الكفاية إلى حيث أريد أن أبدأ باستخدام log4cplus.أعتقد أنني قريبة ولكن qmake لم تتعاون.

أنا على التوالي على آلة ويندوز ، جمعت log4cplus مثل مكتبة ثابتة تحت cygwin ($ ./configure --enable-static).

السؤال الأول
عندما جمعت log4cplus حصلت على ملفين.

  • liblog4cplus.a
  • liblog4cplus.dll.a

هل يجب أن تشمل كلا منهم ؟ ما هو مع .dll.a الملف ؟

السؤال الثاني
عند ترجمة وزارة التجارة نجحت دول مجلس التعاون الخليجي ولكن يفشل عند محاولة استخدام أي من 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();
}
هل كانت مفيدة؟

المحلول

على افتراض أن كل شيء آخر هو الصحيح ، يجب تغيير يبس إلى هذا:

LIBS += -llog4cplus

أنا العلم يقول g++ إلى تعيين مسار البحث عن المكتبات.أنا العلم يقول أن الرابط المحدد مكتبة (مع lib - بادئة نوع الملف إزالتها).

إذا كنت تقصد كبيرة في الحجم بدلا من التعقيد عندما كنت أقول التطبيق الخاص بك هو الحصول على "كبير" ، قد ترغب في أن تسأل نفسك لماذا كنت تستخدم ربط ثابت في المقام الأول (انظر في هذا الموضوع).

نصائح أخرى

تحتاج إلى وضع شيئين على الرابط الخاص بك خط:

-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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top