2011-05-12 3 views
1

Newish C++ 프로그래머가 여기 있습니다. QT4 응용 프로그램을 만들고 있는데 log4cplus를 사용하여 시작할 위치에 충분히 커졌습니다. 나는 가깝다고 생각하지만 qmake는 여전히 협력하고 있지 않습니다.QT4 응용 프로그램에 정적 외부 라이브러리 포함

Windows 컴퓨터에서 실행 중이며 cygwin ($ ./configure --enable-static) 아래에 정적 라이브러리로 log4cplus를 컴파일했습니다.

첫 번째 질문
log4cplus를 컴파일 할 때 두 개의 파일이 있습니다.

liblog4cplus.dll.a

  • liblog4cplus.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에 있습니다.

      내 디렉토리 구조는 이것이다 : 내 .PRO 파일의

      tilex 
          /lib 
           /<*.a files> 
          /external 
             /log4cplus 
               /<header files> 
      

      관련 부분. (컴파일하고 log4cplus없이 잘 실행)

      INCLUDEPATH += C:\\work\\workspace\\tilex\\external 
      QMAKE_LIBDIR += C:\\work\\workspace\\tilex\\lib 
      LIBS += -Lliblog4cplus.a 
      

      내 주요 파일을 (나는 모든 이들 변수의 여러 순열을 시도하고 여전히 같은 결과를 얻을했습니다).

      #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

    :

    은 다른 방법은 직접 -L 또는 -l를 사용하지 않고 링크 라인 라이브러리의 전체 경로를 넣을 수

    LIBS += -llog4cplus 
    

    -L 플래그는 g ++에 라이브러리를 찾을 경로를 설정하도록 지시합니다. -l 플래그는 지정된 라이브러리 (lib- 접 두부와 파일 유형이 제거 된)를 링크하도록 지시합니다.

    응용 프로그램이 '커지다'고 말할 때 복잡성이 아닌 크기가 클 경우 처음에는 정적 링크를 사용하는 이유를 물을 수 있습니다 (thread 참조).

    +0

    -llog4cplus가 작동했습니다. 정말 고마워요! 정적 링크와 동적 연결 포스트가 도움이되었습니다. C++ 세계에 처음이되어서 나는 그 차이점을 알지 못했습니다. – LeviX

    0

    당신은 당신의 연결 라인에 두 가지를 넣어해야합니다

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

    -llog4cplus 
    

    -L

    는 검색 경로에 디렉토리를 추가하는 링커를 알려줍니다. -l은 링커에게 lib이 앞에 붙어 있고 .a 또는 .so이 붙은 파일을 찾도록 지시합니다. 따라서 -lfoo은 링커 검색 경로에서 libfoo.a 또는 libfoo.so을 찾도록 링커에 지시합니다. 당신이 당신의 LIBS을 변경해야 다른 모든 올바른 가정

    g++ blah blah directory\where\log4c\library\file\lives\liblog4cplus.a blah blah 
    
    관련 문제