我使用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
myLib
的CMake文件看起来像
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
目标下,而头文件放在 gather-all 过滤器外部依赖项
我尝试直接使用add_library
或target_sources
将标头文件添加到目标。不幸的是,由于来自Qt元对象系统的符号的多个声明(在moc文件中生成),这会导致编译器警告(VS)或编译器错误(GCC)。
如何在获得稳定的无警告构建的同时从Visual Studio中的外部依赖项过滤器中获取头文件?