Boost 载入动态链接库
计算学徒
2024年12月27日 23:04
收录于文集
共106篇

一些共享的软件功能模块可能是通过动态链接库的方式进行发布的. 模块发布者会发布一个动态链接库 (dll 文件或者 so 文件) 以及相关的接口文档, 通常没有头文件. 因为没有头文件, 所以无法直接包含到 C++ 项目源文件中进行编译和链接. 如果需要使用动态链接库, 则需要直接载入动态链接库中的导出函数.

Boost.DLL 开源库提供了载入动态链接库的功能, 要实现载入动态链接库中的导出函数非常方便. 下面就来看一段代码:

代码块
C++
自动换行
复制代码
#include <boost/dll.hpp>
#include <iostream>

int main() {
  /**
   * 根据操作系统载入 mymath.dll 或者 mymath.so
   */
  boost::system::error_code ec;
  boost::dll::shared_library lib("mymath",
                                 boost::dll::load_mode::append_decorations, ec);

  if (ec) {
    std::cout << "LIBRARY NOT LOADED" << std::endl;
    return -1;
  }

  if (lib.has("x_times_y")) {
    auto& x_times_y = lib.get<double(double, double)>("x_times_y");
    std::cout << "3 * 4 = " << x_times_y(3, 4) << std::endl;
    return 0;
  } else {
    std::cout << "FUNCTION NOT FOUND: x_times_y" << std::endl;
    return -1;
  }
}

/*
 * 成功运行会输出:
 * 3 * 4 = 12
 *
 * 如果 mymath.dll 不存在, 运行会输出:
 * LIBRARY NOT LOADED
 *
 * 如果 mymath.dll 中没有导出函数 x_times_y, 运行会输出:
 * FUNCTION NOT FOUND: x_times_y
 */
复制成功

手头有一个动态链接库文件 mymath.dll, 其中定义了一个导出函数 double x_time_y(double, double). boost::dll::shared_library 用于载入一个动态链接库文件, shared_library::has 用于判断动态链接库中是否存在给定名称的导出函数, shared_library::get 函数用于载入动态链接库中的一个给定函数签名的导出函数, 函数载入后就可以直接使用, 非常方便.

(完)