Включить проблемы при использовании CMake с Gnu в проекте Qt

Я начинаю мультиплатформенный (Win Xp, Linux) проект qt. Я хочу использовать сборку из исходного кода, поэтому моя структура каталогов выглядит следующим образом:

project/
  CMakeLists.txt   (global CMake file, includes other CMakeLists)
  build/           (my build directory)
  libA/
    CMakeLists.txt
  mystuff/
    subprojectA/
      CMakeLists.txt
    subprojectB/
      CMakeLists.txt

Поэтому, когда я использую это в Windows с генератором Visual Studio, все строится нормально. Если я использую ту же структуру и CMakeLists в Linux или под Windows с генератором MinGW, я получаю ошибки компиляции, потому что сгенерированные qt файлы (через moc и uic), лежащие в каталоге сборки, не могут найти мои заголовочные файлы в моих подпроектах. Некоторые из сгенерированных qt заголовочных/исходных файлов зависят от моих заголовочных/исходных файлов, потому что я использую продвигаемые виджеты в своих файлах .ui, которые указывают на реализацию в моем источнике. Опять же под Visual Studio/NMake все нормально компилируется.

В качестве обходного пути я могу использовать исходную сборку, которая работает нормально, или я могу добавить следующее в глобальный CMakeLists.txt:

include_directories(
  mystuff/subprojectA
  mystuff/subprojectB
)

Но каково правильное решение? Большое спасибо!!


person Lars Bilke    schedule 25.08.2009    source источник


Ответы (2)


У меня аналогичная проблема с включениями для сборок из исходного кода в unix (хотя я не использую QT), и в каждом реализованном проекте я добавил:

include_directories( . )

Не самый элегантный, но я работал на меня.

person iain    schedule 25.08.2009
comment
эй здорово, что работает для меня! не идеальный ответ, но хороший обходной путь, спасибо! - person Lars Bilke; 26.08.2009

В проекте, над которым я работаю, я использую этот оператор для обработки включений в мой CMakeLists.txt:

 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${QT_INCLUDES} ${OPENSSL_INCLUDE_DIR})

Ключевое слово ${CMAKE_CURRENT_BINARY_DIR}, надеюсь, поможет.

Примечание: если вы используете gcc 4.4.x с включенными исключениями, вы можете использовать это, чтобы он не связывался с libgcc_s_sjlj-1.dll в Windows.

 SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "-static-libgcc")
person OneOfOne    schedule 16.11.2009
comment
Нет, я не хочу включать мои файлы moc (что я уже делаю) и так далее, но мои сгенерированные файлы moc должны включать некоторые файлы (моих подпроектов) для себя, потому что я использую продвигаемые виджеты в файлах .ui. Итак, ответ от iain решает мою проблему. - person Lars Bilke; 17.11.2009