Qt工程
引用:简书-cmake配置Qt工程、CMake入门、cmake常用命令的一些整理
#指定cmake的最小版本
cmake_minimum_required(VERSION 3.4.0)
#设置工程名称
project(HelloWorld)
#生成可执行程序到指定目录
set(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin")
#设置包含目录
例如将包含目录设置为当前项目文件夹下include文件夹
include_directories(${PROJECT_SOURCE_DIR}/include)
#设置链接库搜索目录
例如将链接库搜索目录设置为当前项目文件夹下lib/linux文件夹
link_directories(${PROJECT_SOURCE_DIR}/lib/linux)
#链接静态库
link_libraries(
静态库1
静态库2
静态库3
...
)
注意,link_libraries中的静态库为全路径,常与 link_directories 搭配使用,例如:
lib1.a lib2.a在目录${PROJECT_SOURCE_DIR}/lib/linux下,则先设置链接目录,再链接相应的库
link_directories( ${PROJECT_SOURCE_DIR}/lib/linux)
link_libraries(
lib1.a
lib2.a
)
#链接动态库
target_link_libraries(所需生成的文件名称 所需链接的动态库名称)
#link_libraries 和 target_link_libraries 区别
在cmake语法中,link_libraries和target_link_libraries是很重要的两个链接库的方式,虽然写法上很相似,但是功能上有很大区别:
(1) link_libraries用在add_executable之前,target_link_libraries用在add_executable之后
(2) link_libraries用来链接静态库,target_link_libraries用来链接导入库,即按照header file + .lib + .dll方式隐式调用动态库的.lib库
#设置工程包含当前目录,非必须
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#设置自动生成moc文件,一定要设置
set(CMAKE_AUTOMOC ON)
#查找需要的Qt库文件,最好每一个库都要写,Qt也会根据依赖关系自动添加
find_package(Qt5Widgets REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
#查找当前文件夹中的所有源代码文件,也可以通过Set命令将所有文件设置为一个变量
#GLOB_RECURSE 与GLOB类似,区别在于它会遍历匹配目录的所有文件以及子目录下面的文件
file(GLOB SRC_FILES RELATIVE ${PROJECT_SOURCE_DIR} *.cxx)
#同理,查找当前文件夹中所有的头文件
file(GLOB HEAD_FILES RELATIVE ${PROJECT_SOURCE_DIR} *.h)
#同理,查找当前文件夹中所有的ui文件
file(GLOB UI_FILES RELATIVE ${PROJECT_SOURCE_DIR} *.ui)
#通过Ui文件生成对应的头文件,一定要添加
qt5_wrap_ui(WRAP_FILES ${UI_FILES})
#添加资源文件
set(RCC_FILES rcc.qrc)
#将ui文件和生成文件整理在一个文件夹中,非必须
source_group("Ui" FILES ${UI_FILES} ${WRAP_FILES} )
#创建工程文件
add_executable(${PROJECT_NAME} ${SRC_FILES} ${HEAD_FILES} ${RCC_FILES} ${WRAP_FILES})
#添加Qt5依赖项
target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Core Qt5::Gui)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 指定生成 MathFunctions 链接库
add_library (MathFunctions SHARED ${DIR_LIB_SRCS})
编译参数
set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS}") #获取环境中的makefile的C++编译器的选项
#不能去掉多余的动态库
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lpthread")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--as-needed")
#可以去掉多余的动态库
#注意顺序
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--as-needed")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lpthread")
GCC
-fPIC 作用于编译阶段,在编译动态库时(.so文件)告诉编译器产生与位置无关代码(Position-Independent Code),若未指定-fPIC选项编译.so文件,则在加载动态库时需进行重定向。
-Wl,-rpath=《动态库文件位置》是为程序添加一个运行时库文件搜索路径的命令,在使用gcc编译链接时添加即可。
-Wl
这个是gcc的参数,表示编译器将后面的参数传递给链接器ld。
添加dtk模块
# 添加dtk模块,find_package( )找不到dtkwidget库
# 使用pkg-config的方法配置第三方库。
find_package(PkgConfig REQUIRED)
pkg_search_module(DtkWidget REQUIRED dtkwidget)
#MESSAGE(STATUS "dtkwidget dirs:" ${Qt5Widgets_INCLUDE_DIRS})
#MESSAGE(STATUS "dtkwidget lib:" ${DtkWidget_LIBRARIES})
include_directories(${DtkWidget_INCLUDE_DIRS})
# link_directories(${DtkWidget_LIBRARIES})
target_link_libraries(${PROJECT_NAME} ${DtkWidget_LIBRARIES})
第三方库
#使用-llog4cpp
#find_package(log4cpp)
#link_directories 告诉linker去这些目录去找libraries
#include_directories 告诉编译器去这些文件夹中去找头文件
link_directories(/usr/local/lib) #这里必须使用绝对路径
#link_libraries 设置所有目标需要链接的库,
#与target_link_libraries的区别单一、所有目标
#link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
## 添加链接库
#target_link_libraries 设置单一目标需要链接的库。
target_link_libraries(${PROJECT_NAME} log4cpp)
链接动态库和直接调用函数
aux_source_directory(. DIR_LIB_SRCS)
include_directories ("${PROJECT_SOURCE_DIR}/../math")
link_directories(${PROJECT_SOURCE_DIR}/../math)
# 指定生成 MathFunctions 链接库
add_library (MathFunctions2 SHARED ${DIR_LIB_SRCS})
#math/下MathFunctions.h和libMathFunctions.so算是同名,
#如果没有libMathFunctions.so,不会报错,但不是链接动态库,而是直接编译源码
target_link_libraries(MathFunctions2 MathFunctions)
#动态库和静态库
#显示的指定后缀即可以选择动态库还是静态库,如果没有指定后缀,优先使用动态库。