CMake动态库生成及使用

本文介绍了如何使用g++在命令行生成动态库libhello.so,包括编译步骤和链接选项。同时,展示了CMake构建动态库的过程,强调了CMakeLists.txt的配置以及子目录管理对于项目解耦的重要性。

命令行生成动态库:

现有hello.h 和 hello.cpp文件,生成动态库:

g++ -c -fPIC hello.cpp hello.h

-c:生成.o文件 ; -fPIC:生成与位置无关的代码(动态库)

g++ -shared -fPIC -o libhello.so hello.o

生成动态库libhello.so

命令行使用动态库:

 g++ -o main.out main.cpp -L. -lhello

 -L. :在当前目录下 指定动态库位置

-lhello :指定动态库名称 

 编译器会去默认的路径下找动态库,需要我们重新设定一下动态库目录:

 

CMake生成动态库:

CMakeLists.txt

# cmake至少3.16以上
cmake_minimum_required(VERSION 3.16)

#工程名字叫
project(hello)

#C++14
set(CMAKE_CXX_STANDARD 14)


#生成动态库
add_library(hello SHARED ${PROJECT_SOURCE_DIR}/hello.cpp)

        一般是新建一个build目录,然后再build目录下执行cmake ,然后生成的文件就会在build目录下。生成Makefile,只需要我们make一下就可以执行Makefile,然后就生成动态库了。

add_subdirectory(libhello)

CMake子目录嵌套

分模块的代码,每一个子目录都必须有一个CMakelists.txt        

 划分成单独的目录好处是,可以单独编译,解耦.

 ①:生成hello.cpp 和 hello.h的动态库

main.cpp:

②:使用动态库

 

在 Qt 项目中使用 CMake 生成动态库(Dynamic Library),需要通过 CMakeLists.txt 文件配置项目类型、编译目标以及相关依赖。以下是详细的实现步骤和配置方法。 ### 1. 基本项目结构 首先,确保你的项目结构如下: ``` MyProject/ ├── CMakeLists.txt ├── include/ │ └── mylibrary_global.h └── src/ ├── myclass.cpp └── myclass.h ``` 其中: - `CMakeLists.txt` 是构建配置文件。 - `include/` 包含导出符号定义头文件。 - `src/` 包含动态库的源代码。 ### 2. 配置 CMakeLists.txt 在 `CMakeLists.txt` 中编写以下内容: ```cmake cmake_minimum_required(VERSION 3.14) project(MyLibrary VERSION 1.0 LANGUAGES CXX) # 设置构建类型(可选) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the build type (Debug, Release)") # 查找 Qt5 或 Qt6 的库 find_package(Qt5 COMPONENTS Core REQUIRED) # 或 Qt6 # 添加动态库目标 add_library(MyLibrary SHARED src/myclass.cpp src/myclass.h ) # 设置目标包含目录 target_include_directories(MyLibrary PUBLIC ${PROJECT_SOURCE_DIR}/include ) # 链接 Qt 库 target_link_libraries(MyLibrary PRIVATE Qt5::Core) # 或 Qt6::Core # 设置导出符号(Windows 上需要) if(WIN32) target_compile_definitions(MyLibrary PRIVATE MYLIBRARY_EXPORTS) endif() ``` ### 3. 编写导出符号头文件 在 `include/mylibrary_global.h` 中定义导出宏: ```cpp #ifndef MYLIBRARY_GLOBAL_H #define MYLIBRARY_GLOBAL_H #include <QtCore/qglobal.h> #if defined(MYLIBRARY_EXPORTS) # define MYLIBRARY_EXPORT Q_DECL_EXPORT #else # define MYLIBRARY_EXPORT Q_DECL_IMPORT #endif #endif // MYLIBRARY_GLOBAL_H ``` 在类头文件中使用导出宏: ```cpp #ifndef MYCLASS_H #define MYCLASS_H #include "mylibrary_global.h" class MYLIBRARY_EXPORT MyClass { public: MyClass(); void greet(); }; #endif // MYCLASS_H ``` ### 4. 实现类功能 在 `src/myclass.cpp` 中实现类方法: ```cpp #include "myclass.h" #include <iostream> MyClass::MyClass() {} void MyClass::greet() { std::cout << "Hello from MyLibrary!" << std::endl; } ``` ### 5. 构建与安装 在项目根目录下执行以下命令构建动态库: ```bash mkdir build && cd build cmake .. cmake --build . ``` 若需安装到指定目录,可在 `CMakeLists.txt` 中添加: ```cmake install(TARGETS MyLibrary DESTINATION lib) install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/ DESTINATION include) ``` 然后执行安装命令: ```bash cmake --install . --prefix /path/to/install ``` ### 6. 在 Qt 项目中使用动态库生成的 `.dll`(Windows)或 `.so`(Linux)文件以及头文件引入其他项目中,并在 CMakeLists.txt 中添加链接: ```cmake target_link_libraries(MyApplication PRIVATE MyLibrary) ``` 这样即可在 Qt 应用程序中使用动态库中的功能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值