deepin下cmake配置

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)
#动态库和静态库
#显示的指定后缀即可以选择动态库还是静态库,如果没有指定后缀,优先使用动态库。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值