我想知道我是否可以编写一个尝试实例化抽象类的.cpp文件:
// file: test_ensure_A_is_abstract.cpp
class A { void foo() = 0; };
int main() { new A; }
// a simple shell script would look like this, but that is missing all the
// options cmake normally generates (-I, -g, -c, -o, ...)
if g++ test_ensure_A_is_abstract.cpp; then exit 1; else exit 0; fi
然后让cmake尝试编译它。我的观点是,我想要证明该类是并且仍然是抽象的,因此无法实例化它。
我知道如何创建一个有效的目标,但我想知道是否有办法为已知无效的目标运行cmake?有人之前做过吗?
更新
根据下面的steveire回答和评论,我编写了自己的模块来完成工作,并确保该类是真正的抽象(而不是指望任何编译器失败作为抽象类的指示。)所以我们必须有与特定错误匹配的错误消息。我支持其中4个,2个清楚地使类抽象(至少一个函数是纯虚拟)和另外2个将受保护和私有构造函数视为一个抽象类(就像抽象类一样,你不能做一个新的&lt ;班级名称>。
你可以在Snap中找到该模块! C ++ git here:
https://sourceforge.net/p/snapcpp/code/ci/master/tree/snapCMakeModules/Modules/
它名为 CheckCXXAbstractClass.cmake 。
答案 0 :(得分:7)
http://www.cmake.org/cmake/help/v3.0/command/try_compile.html
http://www.cmake.org/cmake/help/v3.0/module/CheckCXXSourceCompiles.html
check_cxx_source_compiles(
"class A { void foo() = 0; };\nint main() { new A; }"
BUILT_ABSTRACT
)
if (BUILT_ABSTRACT)
message(FATAL_ERROR "A can be instantiated, but should be abstract.")
endif()
如果您正确设置#include "A"
变量,则可以CMAKE_REQUIRED_INCLUDES
。