使用Qt creator或其他ide新建一个类,比如testlib,在类中写点东西,以确定是否调用成功。
cmake_minimum_required(VERSION 3.5)
project(testlib LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 COMPONENTS Core REQUIRED)
add_library(testlib SHARED
testlib_global.h
testlib.cpp
testlib.h
target_link_libraries(testlib PRIVATE Qt5::Core)
target_compile_definitions(testlib PRIVATE TESTLIB_LIBRARY)
#ifndef TESTLIB_H
#define TESTLIB_H
#include "testlib_global.h"
#include <iostream>
class TESTLIB_EXPORT Testlib
public:
Testlib();
static void num1To100();
#endif
#include "testlib.h"
using namespace std;
Testlib::Testlib()
void Testlib::num1To100()
for(int i = 1; i <= 100; i++)
cout<<i<<" ";
这个类提供一个静态函数,输出1到100数字。
此时可以关闭IDE,使用cmake-gui构建,再借助VS生成动态库,或者直接使用IDE的构建编译功能。完成这一步后会在设定的build文件夹中找到生成的动态库.dll文件
这一步必须确保使用的构建套件与另一项目使用的完全一致,否则会出现undifined reference _imp的报错。
找一个地方新建文件夹,命名为include之类的,将前面库的头文件放进去
在另一项目的cmakelist中添加内容include_directories(“D:\codes\testlib\include”)
link_directories(“D:\codes\build_testlib\Debug”)
target_link_libraries(awindow PRIVATE Qt5::Widgets testlib.lib),添加后的cmakelist类似于
cmake_minimum_required(VERSION 3.5)
project(awindow LANGUAGES CXX)
#find_library(libvar libtestlib "D:/codes/build-testlib-Desktop_Qt_5_14_1_MinGW_64_bit-Debug/")
include_directories("D:\\codes\\testlib\\include")
link_directories("D:\\codes\\build_testlib\\Debug")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# QtCreator supports the following variables for Android, which are identical to qmake Android variables.
# Check http:
# They need to be set before the find_package(Qt5 ...) call.
#if(ANDROID)
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
# if (ANDROID_ABI STREQUAL "armeabi-v7a")
# set(ANDROID_EXTRA_LIBS
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libcrypto.so
# ${CMAKE_CURRENT_SOURCE_DIR}/path/to/libssl.so)
# endif()
#endif()
find_package(Qt5 COMPONENTS Widgets REQUIRED)
if(ANDROID)
add_library(awindow SHARED
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
else()
add_executable(awindow
main.cpp
mainwindow.cpp
mainwindow.h
mainwindow.ui
endif()
target_link_libraries(awindow PRIVATE Qt5::Widgets testlib.lib)
此时就能正常使用库了,依旧需要注意确保构建套件与生成库时的套件完全一致。
#include "mainwindow.h"
#include "./ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
ui->setupUi(this);
MainWindow::~MainWindow()
delete ui;
void MainWindow::on_pushButton_clicked()
Testlib::num1To100();
项目结构如右图1所示,包括 TestDynamic.pro 、testdynamic.h 、testDynamic_global.h和 testdynamic.cpp文件
在 testdynamic.h 文件中声明新函数 Sum(),在testdynamic.cpp中进
在Qt日常开发过程中常常需要采用自建库的方法将一些功能封装到库中以进行应用程序开发,按照调用方法可以分为静态调用和动态调用。本文将以一个简单示例构建过程,对Qt动态链接库(.dll)的动态链接进行介绍。
guide to build qt library and use in another projectGuidebuild qt libraryQObject classclass SHARED_EXPORT CameraGrabber : public QObject{Q_OBJECTsignals :void sendFrameTrash(int nCameraID, int nTotal...
SET(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_SYSTEM_VERSION 1)
include(CMakeForceCompil
用CMake来组织的工程中要用Qt首先要设置、找到Qt相关模块。主要是通过find_package这个CMake命令。但网上很多教程都过时了,或者不够清晰灵活。因为这部分很常用,所以特别用一篇文章把我们目前在生产环境中使用的方法给大家介绍下。
设置Qt库路径
Qt版本很多,我们的开发机上一般也装有多个不同版本的Qt。个人尝试性的项目一般用最新版的Qt,而真正发布的产品一般用的是LTS版本Qt(LTS:Long Term Support,长期支持版本,目前最新的LTS是5.9)。
我们的方法是在系统中添