2012-10-18 2 views
2

본질적으로 나는 헤더의 파일 이름을 알지 못하는 추가적인 어려움을 가진 cmake의 어떤 타겟이 아닌 헤더 파일을 moc 할 수 있기를 원합니다.cmake의 automoc을 파일 이름을 알지 못하는 외부 헤더 파일에 사용

실제 프로젝트는 매우 복잡하며 자동화 된 빌드 시스템의 일부입니다. 다음은 쉬운 예입니다. 이 같은 구조 프로젝트 고려 :

CMakeLists.txt을
SRC/lib 디렉토리/source.cpp
SRC/lib 디렉토리/CMakeLists.txt
SRC/source.cpp에 포함되어/some_header.hpp 번호를 포함 주요 CMakeLists.txt의


내용 : SRC/lib 디렉토리/C의

cmake_mimimum_required(VERSION 2.8.6) 
project("automoctest") 
add_subdirectory(src/lib) 



내용 MakeLists.txt :

include_directories(${CMAKE_HOME_DIRECTORY}/src/include) 
find_package(Qt4 4.8 REQUIRED QtCore) 
include(UseQt4) 
include_directories(${CMAKE_CURRENT_BINARY_DIR}) 
add_library(foo SHARED source.cpp) 
target_link_libraries(foo ${QT_LIBRARIES}) 
set_target_properties(foo PROPERTIES AUTOMOC true) 



내부 source.cpp 파일 some_header.hpp이 같이 포함되어 있습니다 :

#include "some_header.hpp" 



이 문제가 :
파일 some_header.hpp이 포함 Q_OBJECT와 몇 가지 신호가 있으므로 moc은 그 마법을 작동해야합니다. 그러나 헤더가 실제 프로젝트 안에 있지 않기 때문에 헤더가 조롱받지 않을 것입니다. 나는 some_header.hpp의 파일 이름조차 모르기 때문에 조롱 당하도록 특별히 추가 할 수는 없다. 분명히 AUTOMOC는 소스 파일에 그 중 하나가 포함되어있는 경우에도 mockable 파일의 include_directory를 검사하지 않습니다. source.cpp
에서

  • 사용의 #include moc_some_header.cpp를 그것이 cmake 설명서에 설명 된대로 : 나는 (실패) 시도 무엇

    . 이것은 cmake가 some_header {.h, .hpp, .hxx, .H}

  • 을 true로 설정하지 못한다고 불평하는 오류를 발생시킵니다. CMAKE_AUTOMOC_RELAXED_MODE를 true로 설정하십시오. 의사가 실제로 무엇을하는지 분명하지는 않습니다. 어쨌든 차이는 없었습니다.
  • AUTOMOC_MOC_OPTIONS를 -Isrc/include 또는 -I/path/to/project/src/include 또는 -I $ {CMAKE_HOME_DIRECTORY}/src/include로 설정하면
    볼 수있는 모든 작업을 수행하지 않습니다.

AUTOMOC의 가장 큰 장점은 실제로 어떤 파일을 조롱해야하는지 알 필요가 없다는 것입니다. 그러나이 경우에는 내 소스 파일에 포함 된 Q_OBJECT가 포함될 수있는 모든 헤더를 알아야합니다.

정확히 어디에서 mockable 파일을 찾으려면 AUTOMOC에 알릴 수있는 방법이 있습니까?

답변

0

AUTOMOC_MOC_OPTIONS-Isrc/include 또는 -I/path/to/myproject/src/include으로 설정 했습니까? 전자가 존재하지 않는 것 같습니다.


저는 항상 MOC 매크로를 사용했습니다. AUTOMOC은 CMake에 내장 된 새로운 것으로 보입니다.나는이 AUTOMOC 작동 할 수 있음을 가정

add_library(foo SHARED source.cpp ../include/some_header.hpp) 

- 라이브러리 또는 실행 파일을 만들 때

나는 보통 모든 헤더를 포함한다. make이 예상대로 작동하도록 추가 된 이점이 있습니다. 헤더가 변경되면 라이브러리를 다시 빌드하십시오. 당신은 미리의 add_library 명령에 파일을 추가 할 수 진정으로없는 경우

, 그럼 난 당신이, source.cpp#include 문을 검색하는 파일을 찾을 수있는 cmake 함수를 작성해야하고, Q_OBJECT 그들을 검색 할 수있을 거라 생각 . 일치하는 경우 변수에 추가하십시오 - 아마도 EXTRA_MOCS. 그러면 add_library 행은

+0

아, 죄송합니다. -I 옵션에 대해 여러 경로를 시도했습니다. CMAKE_HOME_DIRECTORY를 사용하는 절대, 상대적 ... 아무 것도 작동하지 않았습니다. – ifschleife

+0

그리고 예, 라이브러리에 헤더를 추가하는 것은 명시 적으로 작동하지만 그렇게 할 수는 없습니다. 나는 다른 해결책 (나 비슷한 것)을 생각했지만 머리글을 직접 스캔하는 것은 너무 번거로운 것처럼 보인다. 나는 automoc에 include 파일을 moc하기 위해 말할 길이 없다고 생각한다. – ifschleife

+2

이것을 달성하는 방법을 찾았습니까? Qt5를 사용하여 같은 보트에 있습니다. –

관련 문제