使用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 // TESTLIB_H
#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://doc.qt.io/qt-5/deployment-android.html for more information.
# 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();
    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)。
我们的方法是在系统