文章目录
- **创建库并实现导出函数**
- **编写CMakeLists.txt**
- **调用**
在使用C++和Qt进行项目开发时,CMake是一个常用的跨平台构建系统生成工具,它能够管理构建过程,生成Makefile或者项目文件。想要使用CMake来动态链接一个库,并调用其中的函数,可以按照以下步骤进行:
创建库并实现导出函数
- 需要在动态库中导出你需要的函数
#ifdef __cplusplus
extern "C"{
#endifQ_DECL_EXPORT int exprotFunc(int a,char b ,void* c);#ifdef __cplusplus
}
#endif
Q_DECL_EXPORT
是导出函数的宏- 防止读取不到正确的字符需加上
__cplusplus
方式
编写CMakeLists.txt
-
例如
cmake_minimum_required(VERSION 3.0) project(MyQtProject) # 设置C++标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) # 寻找Qt库 find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED) # 添加你的库路径 target_link_directories(${CMAKE_SOURCE_DIR}/path/to/your/library) # 添加你的库文件 set(LIBSQt5::GuiQt5::WidgetsQt5::Core)# 添加你的Qt项目add_executable(${PROJECT_NAME} main.cpp)# 链接Qt库和你的库 target_link_libraries(${PROJECT_NAME} ${LIBS})
-
path/to/your/library
是库文件所在的目录。
调用
-
需要在源代码中包含库的头文件。例如:
#include <QApplication> #include <QMainWindow> #include <QLibrary> // 包含你的库的头文件 #include "yourlibraryheader.h"using Init = decltype(exprotFunc) int main(int argc, char *argv[]) {QApplication app(argc, argv);QMainWindow window;window.show();QLibrary library("./yourlibrary.dll")if(library.load()){// typedef int (*yourType)(int,char,void*)//auto Func = (Init)(library.resolve("exprotFunc"));auto Func = reinterpret_cast<Init*>(library.resolve("exprotFunc"));if(Func){bool result = Func(a,b,c); }}library.unload();return app.exec(); }
-
QLibrary library(“./yourlibrary.dll”):创建了一个QLibrary对象,并指定了要加载的DLL的路径。
-
library.resolve(“exprotFunc”):尝试在加载的DLL中解析名为exprotFunc的函数。如果解析成功,返回该函数的函数指针。
-
reinterpret_cast<Init>(…)*:将解析得到的函数指针转换为Init类型。这里Init是通过decltype获取的exprotFunc函数的类型。也可以使用注释的
typedef
方式 -
Func(a, b, c):如果解析成功,这里调用函数。这里的a, b, c应该是传递给函数的实际参数。
-
library.unload():在调用完函数后,卸载DLL。