Включите проблемы при использовании CMake с Gnu в проекте Qt - PullRequest
1 голос
/ 25 августа 2009

Я запускаю мультиплатформенный (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), лежащие в каталоге build, не могут найти мои заголовочные файлы в моих подпроектах. Некоторые из сгенерированных qt заголовочных / исходных файлов зависят от моих заголовочных / исходных файлов, потому что я использую продвинутые виджеты в моих .ui-файлах, которые указывают на реализацию в моем источнике. Снова под Visual Studio / NMake все компилируется нормально.

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

include_directories(
  mystuff/subprojectA
  mystuff/subprojectB
)

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

Ответы [ 2 ]

2 голосов
/ 25 августа 2009

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

include_directories( . )

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

1 голос
/ 17 ноября 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")
...