qt使用cmake生成动态库,并在其他项目中使用的完整过程,解决_imp报错

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

在这里插入图片描述

假设我们有一个动态库 `libfoo.so`,并且我们想在 C++ 代码使用它。下面是一个简单的示例: 首先,我们需要编写一个 CMakeLists.txt 文件来指示 CMake 如何生成我们的可执行文件和链接我们的动态库。假设我们的源代码文件是 `main.cpp`,我们的动态库位于 `/path/to/libfoo.so`。我们可以这样编写 CMakeLists.txt 文件: ```cmake cmake_minimum_required(VERSION 3.10) project(MyProject) # 添加可执行文件 add_executable(my_executable main.cpp) # 添加动态库目录和名称 link_directories(/path/to) target_link_libraries(my_executable foo) ``` 其,我们使用 `add_executable` 命令来创建一个名为 `my_executable` 的可执行文件,并将 `main.cpp` 添加为源文件。然后,我们使用 `link_directories` 命令来指定我们的动态库所在的目录,并使用 `target_link_libraries` 命令将动态库链接到我们的可执行文件。 接下来,我们需要在 C++ 代码包含动态库的头文件并使用的函数。假设我们的动态库定义了一个名为 `foo` 的函数,我们可以这样编写 `main.cpp`: ```cpp #include <iostream> #include "foo.h" int main() { std::cout << foo() << std::endl; return 0; } ``` 在这个例子,我们包含了 `foo.h` 头文件并调用了 `foo` 函数,并将其输出到标准输出。 最后,我们可以使用以下命令来编译和运行我们的代码: ```bash mkdir build cd build cmake .. make ./my_executable ``` 这将生成一个名为 `my_executable` 的可执行文件,并将动态库链接到其。当我们运行可执行文件时,它将调用 `foo` 函数并将其输出到控制台。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值