【问题标题】:How to modify CMakelists for Qt5 from Windows to Linux?如何将 Qt5 的 CMakelists 从 Windows 修改为 Linux?
【发布时间】:2017-03-10 00:47:35
【问题描述】:

(问题已经解决)

如果只是 $qtcreator openglwindow/openglwindow.pro 用于 Qt5-OpenGL-example(http://doc.qt.io/qt-5/qtgui-openglwindow-example.html),它将编译

我的CMakelist可以在Win10上构建,但是在linux上失败,命令是:

[user]$ mkdir build && cd build && cmake .. && make 

输出错误如下:

 Scanning dependencies of target QtGL_test_automoc 
 [ 20%] Automatic mocfor target QtGL_test 
 Generating moc source QtGL_test_automoc.dir/moc_openglwindow_LRW7M26ARLGWDK.cpp 
 Generating moc compilation QtGL_test_automoc.cpp 
 [ 20%] Built target
 QtGL_test_automoc Scanning dependencies of target QtGL_test 
 [ 40%] Building CXX object CMakeFiles/QtGL_test.dir/main.cpp.o
 c++: fatal error: no input files compilation terminated. 
 /bin/sh:-DQT_CORE_LIB: command not found 
 make[2]: *** [CMakeFiles/QtGL_test.dir/build.make:63: MakeFiles/QtGL_test.dir/main.cpp.o] Error 127 
 make[1]: ***[CMakeFiles/Makefile2:68: CMakeFiles/QtGL_test.dir/all] Error 2 make:
 *** [Makefile:84: all] Error 2

我试图弄清楚如何修改 linux 的跨平台版本。

这是我的 CMakeLists.txt:

cmake_minimum_required (VERSION 3.5)

set(PRROJ_NAME QtGL_test) 
project (${PRROJ_NAME})

set(HEADERS ${HEADERS} openglwindow.h ) 
set(SOURCES ${SOURCES} main.cpp ${HEADERS}) 
set(CMAKE_AUTOMOC ON)

add_executable(${PRROJ_NAME} ${SOURCES})
set(PROJ_INCLUDE_DIRS ${PROJ_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR})

add_library(openglwindow openglwindow.cpp) 
set(PROJ_LIBRARIES ${PROJ_LIBRARIES} openglwindow)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

if(WIN32)
    find_path(CMAKE_PREFIX_PATH NAMES lib/cmake/Qt5/Qt5Config.cmake HINTS
        "$ENV{Qt5_ROOT}"
    )
    message("Qt5_ROOT is $ENV{Qt5_ROOT}") 
endif() 
message("CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}")

list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)

set(NEED_QT_COMPONENTS QTCORE QTGUI)
message("finding ${NEED_QT_COMPONENTS}")
foreach(COMPONENT Gui Core)
    message("find_package(Qt5${COMPONENT})")
    find_package("Qt5${COMPONENT}")
    message("Qt5${COMPONENT}_FOUND is ${Qt5${COMPONENT}_FOUND}")
    if("${Qt5${COMPONENT}_FOUND}")
        set(PROJ_INCLUDE_DIRS ${PROJ_INCLUDE_DIRS} "${Qt5${COMPONENT}_INCLUDE_DIRS}")
        set(PROJ_LIBRARIES ${PROJ_LIBRARIES} "Qt5::${COMPONENT}")
        add_definitions("${Qt5${COMPONENT}_DEFINITIONS}")
        qt5_use_modules(${PRROJ_NAME} ${COMPONENT})
    endif() 
endforeach(COMPONENT )

message("include_directories(${PROJ_INCLUDE_DIRS})")
include_directories(${PROJ_INCLUDE_DIRS})
message("target_link_libraries(${PRROJ_NAME} ${PROJ_LIBRARIES})")
target_link_libraries(${PRROJ_NAME} ${PROJ_LIBRARIES})
set(CMAKE_CXX_STANDARD 14)

if(UNIX)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/local/include -Wall")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") 
endif()

【问题讨论】:

  • 咨询 Qt 的开发者,而不是 SO。
  • 调试CMake项目编译时,使用make VERBOSE=1,它会显示执行的精确命令。
  • 这是一个非常可怕的 CMakeLists。尝试使用这个的一些部分:CMakeLists.txt for your Qt project

标签: c++ linux qt cmake qt5


【解决方案1】:

终于解决的版本:

cmake_minimum_required (VERSION 3.5)

set(PRROJ_NAME QtGL_test) 
project (${PRROJ_NAME})

set(HEADERS ${HEADERS} openglwindow.h ) 
set(SOURCES ${SOURCES} main.cpp ${HEADERS}) 
set(CMAKE_AUTOMOC ON)

add_executable(${PRROJ_NAME} ${SOURCES})
set(PROJ_INCLUDE_DIRS ${PROJ_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR})

add_library(openglwindow openglwindow.cpp) 
set(PROJ_LIBRARIES ${PROJ_LIBRARIES} openglwindow)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

if(WIN32)
    find_path(CMAKE_PREFIX_PATH NAMES lib/cmake/Qt5/Qt5Config.cmake HINTS
        "$ENV{Qt5_ROOT}"
    )
    message("Qt5_ROOT is $ENV{Qt5_ROOT}") 
endif() 
message("CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH}")

list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)

set(QT_FLAGS "-fPIC")
set(NEED_QT_COMPONENTS QTCORE QTGUI)
message("finding ${NEED_QT_COMPONENTS}")
foreach(COMPONENT Gui Core)
    message("find_package(Qt5${COMPONENT})")
    find_package("Qt5${COMPONENT}")
    message("Qt5${COMPONENT}_FOUND is ${Qt5${COMPONENT}_FOUND}")
    if("${Qt5${COMPONENT}_FOUND}")
        set(PROJ_INCLUDE_DIRS ${PROJ_INCLUDE_DIRS} "${Qt5${COMPONENT}_INCLUDE_DIRS}")
        set(PROJ_LIBRARIES ${PROJ_LIBRARIES} "Qt5::${COMPONENT}")
        #Open add_definitions  will error
        #add_definitions("${Qt5${COMPONENT}_DEFINITIONS}")
        qt5_use_modules(${PRROJ_NAME} ${COMPONENT})
    endif() 
endforeach(COMPONENT )

message("include_directories(${PROJ_INCLUDE_DIRS})")
include_directories(${PROJ_INCLUDE_DIRS})
message("target_link_libraries(${PRROJ_NAME} ${PROJ_LIBRARIES})")
target_link_libraries(${PRROJ_NAME} ${PROJ_LIBRARIES})
set(CMAKE_CXX_STANDARD 14)

if(UNIX)
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${QT_FLAGS} -I/usr/local/include -Wall")
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") 
endif()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2017-04-13
    相关资源
    最近更新 更多