Я использую CMake 3.5+ для управления своим проектом Qt5. Поскольку я работаю с CLion и Visual Studio, я бы хотел использовать целевые фильтры VS.
Как рекомендую для CMake 3.5 и Qt5, я использую CMAKE_AUTOMOC=ON
а также CMAKE_INCLUDE_CURRENT_DIR=ON
,
Мои файлы организованы следующим образом
myLib
impl
bar.cpp
bar_p.hpp
foo.cpp
foo_p.hpp
bar.hpp
foo.hpp
Файл CMake для myLib
похоже
add_library(myLib STATIC
${CMAKE_CURRENT_LIST_DIR}/impl/bar.cpp
${CMAKE_CURRENT_LIST_DIR}/impl/foo.cpp)
target_link_libraries(myLib
PUBLIC Qt5::Core)
Шаблон для моих исходных и заголовочных файлов выглядит следующим образом:
bar.hpp
:
#pragma once
#include <QtCore/QObject>
class BarPrivate;
class Bar : public QObject {
Q_OBJECT
public:
// the usual stuff
private:
QScopedPointer<BarPrivate> q_ptr;
Q_DECLARE_PRIVATE(Bar)
};
impl/bar_p.hpp
:
#include "bar.hpp"
class BarPrivate {
Q_DISABLE_COPY(BarPrivate)
public:
// the usual stuff
private:
Bar* const q_ptr;
Q_DECLARE_PUBLIC(Bar)
};
impl/bar.cpp
:
#include "bar.hpp"#include "impl/bar_p.hpp"
// definitions for BarPrivate
// definitions for Bar
#include "moc_bar.cpp"
Это прекрасно работает в Unix (например, в CLion) и дает мне чистые сборки без предупреждений также с Visual Studio.
Однако в VS только исходные файлы отображаются под myLib
цель, в то время как заголовочные файлы помещаются под собрать все- фильтр Внешние зависимости.
Я попытался добавить заголовочные файлы к цели либо напрямую с помощью add_library
или через target_sources
, К сожалению, это приводит к предупреждениям компилятора (VS) или ошибкам компилятора (GCC) из-за множественных объявлений символов из мета-объектной системы Qt (как сгенерировано в файлах moc).
Как я могу получить файлы заголовков из Внешние зависимости фильтр в Visual Studio при получении стабильных сборок без предупреждений?
Задача ещё не решена.
Других решений пока нет …