我这里有一个相当特殊的设置,我对CMake没有足够的了解来找出问题所在。
我在 Ubuntu 12.04 上。我从apt-add-repository ppa:ubuntu-sdk-team/ppa
安装了Qt5,从apt-add-repository ppa:kalakris/cmake
(https://launchpad.net/~kalakris/+archive/ubuntu/cmake)安装了CMake 2.8.11.2。
以下是完整的最小测试用例:
daniel@omni-travis-test:~/projects/qtcmaketest$ ls
blubb.cpp CMakeLists.txt
daniel@omni-travis-test:~/projects/qtcmaketest$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8.11)
project (qtcmaketest)
find_package (Qt5Widgets REQUIRED)
add_executable(qtcmaketest blubb.cpp)
target_link_libraries (qtcmaketest Qt5::Widgets)
daniel@omni-travis-test:~/projects/qtcmaketest$ cat blubb.cpp
#include <QWidget>
#include <QApplication>
int main (int argc, char * argv[])
{
QApplication app (argc, argv);
QWidget foo;
foo.show ();
}
daniel@omni-travis-test:~/projects/qtcmaketest$ cmake . && make
-- The C compiler identification is GNU 4.8.1
-- The CXX compiler identification is GNU 4.8.1
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/daniel/projects/qtcmaketest
Scanning dependencies of target qtcmaketest
[100%] Building CXX object CMakeFiles/qtcmaketest.dir/blubb.cpp.o
/home/daniel/projects/qtcmaketest/blubb.cpp:1:19: fatal error: QWidget: No such file or directory
#include <QWidget>
^
compilation terminated.
make[2]: *** [CMakeFiles/qtcmaketest.dir/blubb.cpp.o] Error 1
make[1]: *** [CMakeFiles/qtcmaketest.dir/all] Error 2
make: *** [all] Error 2
为什么find_package成功时缺少包含目录?
我正在使用本指南:http://qt-project.org/doc/qt-5/cmake-manual.html
我刚刚注意到,当按照"将Qt 5与低于2.8.9的CMake一起使用"一章的说明进行操作时,编译工作。我添加了以下行:
include_directories(${Qt5Widgets_INCLUDE_DIRS})
add_definitions(${Qt5Widgets_DEFINITIONS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
我知道这应该在没有这些行的情况下工作,因为它运行在 Ubuntu 14.04 盒子上(默认情况下包括适当的 Qt 和 CMake 版本)。我不希望得到这个问题的解决方案,但我可能需要一些关于在哪里寻找问题的指示。
确定问题出在Qt的版本上。我认为这个早期的Qt 5版本不包括CMake脚本,无法单独正确使用find_package
。
在具有较新Qt 5的新发行版上,它可以按预期工作。看起来您必须添加特殊的版本检查以包含或排除我提到的作为解决方法的行。
附加信息:由于 Ubuntu 12.04 真的很旧,我决定不支持它作为我项目的目标构建平台。我最初的原因是 Travis CI 使用 12.04,但由于它非常麻烦,我将保留我的 travis 构建,直到它们升级到 14.04,这似乎是一个相当大的问题。特拉维斯在2014年12月12日发推文给我说:
Travis CI:我们正在努力。大多数部分都在那里,但基础设施存在一个关键问题。感谢您的耐心等待。
我最近遇到了同样的问题,并找到了以下解决方案来安装较新的Qt5版本,从而使cmake能够正常运行:
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty universe"
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu trusty main"
sudo add-apt-repository --yes ppa:kalakris/cmake
sudo apt-get update -qq
sudo apt-get install cmake
sudo apt-get install qdbus qmlscene qt5-default qt5-qmake qtbase5-dev-tools qtchooser qtdeclarative5-dev xbitmaps xterm libqt5svg5-dev qttools5-dev qtscript5-dev qtdeclarative5-folderlistmodel-plugin qtdeclarative5-controls-plugin -y
最后,我最终使用以下.travis.yml
文件来启动工作:
https://github.com/hzdr/qutselect/blob/master/.travis.yml
希望这也解决了你的问题。