• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

CLionC++加载静态库和动态库

武飞扬头像
why2214
帮助2

记录学习内容

编译环境:

IDE:CLion 2022.2

ToolChains:MinGW64

一、加载静态库 

1、生成静态库

用 求平方 举例:

先编写静态库文件Math.cpp 输出num的平方

  1.  
    #include <iostream>
  2.  
    #include <cstdlib>
  3.  
    using namespace std;
  4.  
     
  5.  
    void customLibTest(const char * num) {
  6.  
    double x = strtod(num, nullptr);
  7.  
    double res = x * x;
  8.  
    cout << "输入x: " << x << "的平方是" << res << endl;
  9.  
    }

在项目CMakeList.txt中用

add_library(Math STATIC math.cpp)

build生成静态库 工程目录下会有Math.lib创建出来

2、调用静态库

在调用静态库的项目目录下创建libs文件夹用来存放上一步生成的静态库文件Math.lib

学新通

在CmakeList.txt中进行如下配置:

  1.  
    cmake_minimum_required(VERSION 3.23)
  2.  
    project(Test1)
  3.  
     
  4.  
    set(CMAKE_CXX_STANDARD 11)
  5.  
     
  6.  
    link_directories(libs) #链接文件夹 指定引用的外部库文件夹路径 用在add_executable或add_library之前
  7.  
     
  8.  
    add_executable(Test main.cpp main.h)
  9.  
     
  10.  
    target_link_libraries(Test Math.lib) #链接目标库文件 指定引用的外部库文件 用在add_executable或add_library之后

 在main.cpp中如下图所示代码 进行调用:

  1.  
    #include <iostream>
  2.  
    //加载静态库
  3.  
    #pragma comment(lib, "Math.lib")
  4.  
    //声明静态库中的方法
  5.  
    void customLibTest(const char * num);
  6.  
     
  7.  
    int main() {
  8.  
    customLibTest("2");
  9.  
    return 0;
  10.  
    }

结果:

学新通

二、加载动态库

1、生成动态库

这里生成动态库的环境是Windows,所以生成的应该是dll文件,如果是Linux生成的应该是so文件。但是调用方式都是一样的。

在CLion中新建动态库工程:

学新通

 还是以求平方为例 编写.cpp和.h如下:

library.h

  1.  
    #ifndef MATH_LIBRARY_H
  2.  
    #define MATH_LIBRARY_H
  3.  
     
  4.  
    void customLibTest(const char * num);
  5.  
     
  6.  
    #endif //MATH_LIBRARY_H

ps:如果有java jna与动态库dll交互的需求 需要在上面头文件的方法前加上 extern "C" (同时要注意的是java版本位数要与编译dll的环境一致,即32位就都是32位,64位就都是64位)

library.cpp

  1.  
    #include "library.h"
  2.  
     
  3.  
    #include <iostream>
  4.  
    using namespace std;
  5.  
     
  6.  
    void customLibTest(const char * num) {
  7.  
    double x = strtod(num, nullptr);
  8.  
    double res = x * x;
  9.  
    cout << "输入x: " << x << "的平方是" << res << endl;
  10.  
    }

CMakeList.txt

  1.  
    cmake_minimum_required(VERSION 3.23)
  2.  
    project(Math)
  3.  
     
  4.  
    set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/output) #修改所生成库的目标文件夹
  5.  
    set(CMAKE_CXX_STANDARD 11)
  6.  
     
  7.  
    add_library(Math SHARED library.cpp)

build一下,会在工程目录下创建output文件夹,文件夹下就是生成出来的dll库文件。

2、调用动态库

先将上一步生成出来的文件都复制到引用动态库的Test1工程目录的libs下:

学新通

调用动态库的工程CMakeList.txt代码配置如下:

  1.  
    cmake_minimum_required(VERSION 3.23)
  2.  
    project(Test1)
  3.  
     
  4.  
    set(CMAKE_CXX_STANDARD 11)
  5.  
     
  6.  
    link_directories(libs) #链接文件夹 用在add_executable或add_library之前
  7.  
     
  8.  
    add_executable(Test main.cpp main.h)
  9.  
     
  10.  
    target_link_libraries(Test cygMath.dll libMath.dll.a) #链接目标库文件 用在add_executable或add_library之后

 C 代码main.cpp中调用的时候可以直接写:

  1.  
    #include <iostream>
  2.  
     
  3.  
    //声明动态库的方法
  4.  
    void customLibTest(const char * num);
  5.  
     
  6.  
    int main() {
  7.  
    customLibTest("8");
  8.  
    return 0;
  9.  
    }

运行结果:

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbjaac
系列文章
更多 icon
同类精品
更多 icon
继续加载