cmake
程序员文章站
2024-03-14 11:33:04
...
cmake
Qt工程
#设置cmake版本号
cmake_minimum_required(VERSION 3.4.0)
#设置工程名称
project(HelloWorld)
#生成可执行程序到指定目录
set(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin")
#设置工程包含当前目录,非必须
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命令将所有文件设置为一个变量
file(GLOB SRC_FILES "./*.cxx")
#同理,查找当前文件夹中所有的头文件
file(GLOB HEAD_FILES "./*.h")
#同理,查找当前文件夹中所有的ui文件
file(GLOB UI_FILES "./*.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})
链接动态库和直接调用函数
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)