Включить статическую внешнюю библиотеку в приложение QT4 - PullRequest
1 голос
/ 13 мая 2011

Новый C ++ программист здесь. Я создаю приложение QT4, и оно стало достаточно большим, чтобы я мог начать использовать log4cplus. Я думаю, что я близко, но qmake все еще не сотрудничает.

Я работаю на компьютере с Windows, и я скомпилировал log4cplus как статическую библиотеку в cygwin ($ ./configure --enable-static).

Первый вопрос
Когда я скомпилировал log4cplus, я получил два файла.

  • liblog4cplus.a
  • liblog4cplus.dll.a

Мне нужно включить их обоих? Что с файлом .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();
}

Ответы [ 2 ]

1 голос
/ 13 мая 2011

Предполагая, что все остальное правильно, вы должны изменить ваши LIBS на:

LIBS += -llog4cplus

Флаг -L указывает g ++ указать путь для поиска библиотек.Флаг -l указывает ему связать указанную библиотеку (с удаленным префиксом lib и типом файла).

Если вы подразумеваете большой размер, а не сложность, когда вы говорите, что ваше приложение становится большим', вы можете спросить себя, почему вы используете статические ссылки в первую очередь (посмотрите на эту тему ).

0 голосов
/ 13 мая 2011

Вы должны поместить две вещи в свою линию связи:

-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
...