【发布时间】:2017-09-07 13:01:03
【问题描述】:
我有一个项目,当我使用 QtCreator 使用 .pro 文件构建它时,它编译得很好。我正在尝试将其转换为 cmake,但遇到了问题。
使用最少的可复制示例进行编辑:
项目文件夹结构:
src/foo.cpp --> #include "ui_foo.h"
src/bar.cpp --> #include "bar.moc"
inc/foo.h
ui/foo.ui
预期编译流程(使用qmake时观察到的流程):
(1) moc inc/foo.h -o moc_foo.cpp
(2) moc src/bar.cpp -o bar.moc
(3) uic ui/foo.ui -o ui_foo.h
(4) gcc src/foo.cpp -o foo.o
(5) gcc src/bar.cpp -o bar.o
(6) gcc moc_foo.cpp -o moc_foo.o
(7) ld foo.o bar.o moc_foo.o -o foobar
CMakeLists.txt(1):
set(CMAKE_INCLUDE_CURRENT_DIR ON )
set(CMAKE_AUTOMOC ON )
set(CMAKE_AUTOUIC ON )
add_executable(foobar src/foo.cpp src/bar.cpp)
moc_foo.cpp 没有被创建(第 1 步和第 6 步被遗漏了)并且没有在第 7 步中被添加到add_executable。由于缺少对象而出现了对 vtable 的未定义引用。我认为这是因为 foo.cpp 和 foo.h 位于不同的文件夹中。
CMakeLists.txt(2):
set(CMAKE_INCLUDE_CURRENT_DIR ON )
qt5_wrap_cpp(foobar_moc inc/foo.h src/bar.cpp)
qt5_wrap_ui (foobar_ui ui/foo.ui)
add_executable(foobar src/foo.cpp src/bar.cpp ${foobar_moc} ${foobar_ui})
moc_bar.cpp 在步骤 2 中生成,而不是 bar.moc。我收到编译器错误,因为在步骤 5 中找不到 bar.moc。
【问题讨论】: