类库大魔王
类库大魔王 懒惰,傲慢,以及无耐心

使用cmake构建Qt5程序的一些坑

突然想试一下CLion上写Qt5程序是什么体验,反正有JB家的全家桶License。CLion使用cmake作为构建工具,而Qt官方也开始支持cmake,但使用过程中还是遇到一些坑,记录一下。

读Qt的cmake使用帮助

这点很重要,一些最重要的问题在使用帮助中已经提到了,一定要逐字逐句读一遍。

设置Qt路径

这个在网上随便搜一下就能找到很多文章都提到了,就是设置到CMAKE_PREFIX_PATHQt5_DIR中,注意设置到系统环境变量中与作为命令行参数传给cmake效果是有区别的,我发现作为命令行参数传递比较省事。

编译可执行文件或动态库

如果编译的项目是个exe或动态库,需要将Qt模块添加到目标链接库列表中,这样cmake就会自动把Qt的头文件路径和库文件路径添加到编译器的搜索路径列表中:

1
target_link_libraries(MyProgram Qt::Widgets Qt::Network Qt::Xml)

编译静态库

如果要编译的项目是个静态库,没法用target_link_libraries,但光是设置CMAKE_PREFIX_PATH仍然会在编译过程中报错找不到Qt的头文件,需要自己加入头文件搜索路径:

1
2
3
4
5
include_directories(
        ${Qt5Widgets_INCLUDE_DIRS}
        ${Qt5Network_INCLUDE_DIRS}
        ${Qt5Xml_INCLUDE_DIRS}
        )

其中Qt5Widgets_INCLUDE_DIRS一项就包含了WidgetsCoreGui三个模块。

编译Qt plugin项目

如果要编译的项目是以QtPlugin形式写成的库,要自己定义一个宏QT_STATICPLUGIN,这样写就可以:

1
add_compile_definitions(QT_STATICPLUGIN=1)

生成mac bundle

macOS上的bundle要多打包图标等一些资源,稍微麻烦一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (APPLE)
    set(MACOSX_BUNDLE true)
    set(MACOSX_BUNDLE_BUNDLE_NAME MyProgram)
    set(MACOSX_BUNDLE_GUI_IDENTIFIER "com.ismisv.myprogram")
    set(MACOSX_BUNDLE_ICON_FILE "MyProgram.icns")
    set(MACOSX_BUNDLE_INFO_STRING "MyProgram")
    set(MACOSX_BUNDLE_LONG_VERSION_STRING "1.0.0.1")
    set(MACOSX_BUNDLE_SHORT_VERSION_STRING "1.0")
    set(MACOSX_BUNDLE_BUNDLE_VERSION "1.0")

    set_source_files_properties("${CMAKE_CURRENT_SOURCE_DIR}/MyProgram.icns" PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
    set_target_properties(
            MyProgram
            PROPERTIES
            RESOURCE "./MyProgram.icns"
            WIN32_EXECUTABLE TRUE
            MACOSX_BUNDLE TRUE
    )
endif()

指定当前项目使用的编程语言

Cmake可以指定当前项目使用的编程语言,比如:

1
project(MyProgram LANGUAGES CXX)

这样cmake只会编译.cpp.cxx这些C++编译器认的文件,如果项目中有一些.c文件,则会被忽略,所以干脆不写就能编译所有类型的文件:

1
project(MyProgram)

感觉本文不错,不妨小额鼓励我一下!
支付宝扫一扫

支付宝扫一扫

微信扫一扫

微信扫一扫

如果你看不到评论框,说明Disqus被墙了。