使用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();
}