【问题标题】:C++ CMAKE Predicate no such fileC++ CMAKE 谓词没有这样的文件
【发布时间】:2016-08-22 09:39:47
【问题描述】:

首先是错误日志:

-- Boost version: 1.59.0
-- Success!
-- Could NOT find Freetype (missing:  FREETYPE_LIBRARY) (found version "2.6.3")
-- LOADING OS --Windows--
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/Gianluca/.CLion2016.2/system/cmake/generated/mcdu-57fe38f9/57fe38f9/Debug
[  1%] Automatic moc for target untitled
[  1%] Built target untitled_automoc
[  2%] Building CXX object CMakeFiles/untitled.dir/main.cpp.obj
[  3%] Building CXX object CMakeFiles/untitled.dir/mainwindow.cpp.obj
[  4%] Building CXX object CMakeFiles/untitled.dir/gldisplay.cpp.obj
[  7%] Building CXX object CMakeFiles/untitled.dir/svg/svg.cpp.obj
[  7%] Building CXX object CMakeFiles/untitled.dir/svg/svgfont.cpp.obj
[  8%] Building CXX object CMakeFiles/untitled.dir/svg/svgstring.cpp.obj
[ 11%] Building CXX object CMakeFiles/untitled.dir/ht1000scriptmanager.cpp.obj
[ 11%] Building CXX object CMakeFiles/untitled.dir/ht1000widgetfactory.cpp.obj
CMakeFiles\untitled.dir\build.make:149: recipe for target 'CMakeFiles/untitled.dir/svg/svg.cpp.obj' failed
In file included from C:\Work\PolitecProductions\mcdu\svg\svg.cpp:1:0:
C:\Work\PolitecProductions\mcdu\svg\svg.h:14:48: fatal error: boost/algorithm/string/predicate.hpp: No such file or directory
 #include <boost/algorithm/string/predicate.hpp>
                                                ^
compilation terminated.
In file included from C:\Work\PolitecProductions\mcdu\svg\svgstring.cpp:3:0:
C:\Work\PolitecProductions\mcdu\svg\./svg.h:14:48: fatal error: boost/algorithm/string/predicate.hpp: No such file or directory
 #include <boost/algorithm/string/predicate.hpp>
                                                ^
compilation terminated.
mingw32-make.exe[2]: *** [CMakeFiles/untitled.dir/svg/svg.cpp.obj] Error 1
mingw32-make.exe[2]: *** Waiting for unfinished jobs....
In file included from C:\Work\PolitecProductions\mcdu\svg\svgfont.cpp:2:0:
C:\Work\PolitecProductions\mcdu\svg\./svg.h:14:48: fatal error: boost/algorithm/string/predicate.hpp: No such file or directory
 #include <boost/algorithm/string/predicate.hpp>
                                                ^
compilation terminated.
CMakeFiles\untitled.dir\build.make:199: recipe for target 'CMakeFiles/untitled.dir/svg/svgstring.cpp.obj' failed
mingw32-make.exe[2]: *** [CMakeFiles/untitled.dir/svg/svgstring.cpp.obj] Error 1
CMakeFiles\untitled.dir\build.make:174: recipe for target 'CMakeFiles/untitled.dir/svg/svgfont.cpp.obj' failed
mingw32-make.exe[2]: *** [CMakeFiles/untitled.dir/svg/svgfont.cpp.obj] Error 1
CMakeFiles\untitled.dir\build.make:249: recipe for target 'CMakeFiles/untitled.dir/ht1000widgetfactory.cpp.obj' failed
In file included from C:\Work\PolitecProductions\mcdu\ht1000widgetfactory.cpp:1:0:
C:\Work\PolitecProductions\mcdu\./ht1000widgetfactory.h:5:25: fatal error: QScriptEngine: No such file or directory
 #include <QScriptEngine>
                         ^
compilation terminated.

更多http://pastebin.com/72ySYdVd

这是我的实际 CMakeLists

cmake_minimum_required(VERSION 3.6)
project(mcdu)


#### Boost Check Version
find_package(Boost REQUIRED)
if(Boost_FOUND)
    message(STATUS "Success!")
endif()
#### Qt5
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Script REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5OpenGL REQUIRED)
find_package(FREETYPE)
set(QT_LIBRARIES Qt5::Widgets Qt5::Core Qt5::OpenGL Qt5::Core Qt5::Script)


set( CMAKE_AUTOMOC ON )  
ADD_DEFINITIONS(${QT_DEFINITIONS})
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage ")
add_definitions("-std=c++11")


# Find includes in corresponding build directories
include_directories(
        ${BOOST}
        ${FREETYPE}
        ${Qt5Widgets_INCLUDE_DIRS}
        -lopengl32 -lglu32 -luser32
)

if (WIN32)
    message(STATUS "LOADING OS --Windows--")
    include_directories(
    ${BOOST}/lib32-msvc-14.0 -libboost_timer-vc140-mt-gd-1_59 -libboost_log-vc140-mt-gd-1_59 -libboost_log_setup-vc140-mt-gd-1_59
    ${FREETYPE}/objs/vc2010/Win32/ -lfreetype263d
    )
endif ()


#Source Files
set(SOURCE_FILES
        src files. Cut to be short

#Header Files
set(HEADER_FILES
        header files. Cut to be short
        )

#Add Forms
QT5_WRAP_UI(FORM_FILES
        .ui files
        )


add_executable(untitled ${SOURCE_FILES} ${HEADER_FILES} ${FORM_FILES})

更多http://pastebin.com/uGf3SHUn

所以在 svg.h 下包含如下: #include &lt;boost/algorithm/string/predicate.hpp&gt;

我有 MSVC2015 和 BOOST + FREETYPE 环境。变量被添加到系统 AND Clion。如果我从 QT 构建它,我只会得到 predicate.hpp 错误。

这是 QT PRO 文件

QT += core gui script opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = mcdu
TEMPLATE = app

DEFINES += WIN
DEFINES += OGLFT_NO_SOLID
DEFINES += OGLFT_NO_QT
DEFINES += TEST

INCLUDEPATH += $$(BOOST)
INCLUDEPATH += $$(FREETYPE)/include
INCLUDEPATH += status
INCLUDEPATH += systems
INCLUDEPATH += svg
INCLUDEPATH += displays

CONFIG += debug

win32 {
    DEFINES += WINDOWS
    LIBS += -lopengl32 -lglu32 -luser32
    LIBS += -L$$(BOOST)/lib32-msvc-14.0 -libboost_timer-vc140-mt-gd-1_59 -libboost_log-vc140-mt-gd-1_59 -libboost_log_setup-vc140-mt-gd-1_59
    LIBS += -L$$(FREETYPE)/objs/vc2010/Win32/ -lfreetype263d
}

linux {
    message("Build for Linux")
    DEFINES += LINUX
    DEFINES += BOOST_LOG_DYN_LINK
    LIBS += -lGLU
    LIBS += -lfreetype
    LIBS += -L/home/RINF/rogosz/source/boost_1_59_0/stage/lib -lboost_timer -lboost_log -lboost_log_setup -lboost_system -lboost_thread -lboost_filesystem
}

SOURCES += src files: cut to be short

HEADERS  += header files. cut to be short

FORMS    += form files. cut to be short

【问题讨论】:

  • 请不要只包含链接。将错误日志、CMakeLists 和 QT PRO 文件实际放入您的问题中。
  • 由于问题不清楚,呈现不佳(没有试图减少问题/接近minimal 示例)而被否决,并且显示出很少的研究工作(显然,OP 没有查阅 CMake 文档)。还是回答了。
  • @DevSolar:你为什么要回答这样的问题?从您的答案中投票并发表您的评论就足够了。
  • @user1234567:因为当我意识到一个问题有多“破碎”时,我已经发现了许多问题。回答他们意味着 1) OP 不会继续认为 SO 没有帮助或 CMake 已损坏; 2)OP有机会标记答案“正确”,关闭问题; 3) OP 有理由接受我的评论,认为我的评论是知情和建设性的,而不是居高临下的。总而言之,称之为“体面”。

标签: c++ qt boost cmake


【解决方案1】:
find_package(Boost REQUIRED)

# ...

# Find includes in corresponding build directories
include_directories(
        ${BOOST}
        ${FREETYPE}
        ${Qt5Widgets_INCLUDE_DIRS}
        -lopengl32 -lglu32 -luser32
)

find_package( Boost ... )设置的变量,包含Boost头文件的路径,命名为Boost_INCLUDE_DIRS,而不是BOOST

除非 FREETYPE 打破这种模式,否则它也应该是 FREETYPE_INCLUDE_DIRS

链接器指令 (-lopengl32 -lglu32 -luser32) 在那里做什么?

if (WIN32)
    message(STATUS "LOADING OS --Windows--")
    include_directories(
    ${BOOST}/lib32-msvc-14.0 -libboost_timer-vc140-mt-gd-1_59 -libboost_log-vc140-mt-gd-1_59 -libboost_log_setup-vc140-mt-gd-1_59
    ${FREETYPE}/objs/vc2010/Win32/ -lfreetype263d
    )
endif ()

很困惑。这甚至意味着什么?您使用命令include_directories(),但看起来好像您正试图在此处提供链接器说明?添加链接依赖是通过target_link_libraries()...

即使您使用正确的命令,您也不会给出链接器指令 (-lfreetype263d),而是列出链接目标,最好是由各种 find_package() 调用提供的链接目标,即 ${Boost_LIBRARIES}(不是 @987654333 @)和${FREETYPE_LIBRARIES}(不是${FREETYPE})。

进一步:

set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS_RELEASE} -fprofile-arcs -ftest-coverage ")
add_definitions("-std=c++11")

如果您使用 Visual Studio,这些是编译器特定的选项,它们不会让您浮出水面。使用 if ( MSVC )if ( CMAKE_COMPILER_IS_GNUCC ) 检查您正在使用的编译器。

【讨论】:

  • @Stealth:没有冒犯的意思,但看起来你在这里是在试错,而不知道你在做什么。您到处都有问题,到目前为止,我一直在查看您的CMakeLists.txt(因为这是您标记问题的内容)...我建议您从更简单的事情开始,并使用手头的 CMake 文档小步前进,直到您觉得满意为止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 2021-12-22
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多