C++创建并使用共享库里的函数

C++共享库可以共享Class,也可以共享函数。而使用共享库的方法也有多种,比较实用的是动态载入。

下面我们编写一个名为factorial的函数,并将其编译为共享库:

factorial.cxx

// demo lib

extern "C" unsigned factorial(unsigned count) {
  unsigned result = 1;
  for (unsigned i = 1; i <= count; result *= i++) { void(0); }
  return result;
}

执行以下命令:

g++ -shared -o factorial.so factorial.cxx

得到factorial.so,编写测试文件:

app.cxx

// use shared lib

#include <iostream>
#include <cstdlib>
#include <dlfcn.h>

const char * lib_path = "./factorial.so";

int main(int argc, char const *argv[]) {
  if (argc == 1) return argc;

  void * lib_handler = dlopen(lib_path, RTLD_LAZY);
  char const * error = nullptr;
  unsigned (*factorial)(unsigned);

  if (error = dlerror()) {
    std::cout << "opened " << lib_path << " failed: " << error << 'n';
  } else if (factorial = (unsigned(*)(unsigned)) dlsym(lib_handler, "factorial"), error = dlerror()) {
    std::cout << "loaded " << lib_path << " failed: " << error << 'n';
  } else {
    std::cout << "the factorial of " << argv[1] << " is " << factorial(strtoul(argv[1], nullptr, 10)) << 'n';
  }

  return dlclose(lib_handler);
}

执行编译指令:

g++ -ldl -o app app.cxx

然后就得到可执行二进制文件app。

共享库有很多优点,它可以将一个项目拆成多个小块,当需要更新某个模块时,只需单独处理那个部分即可。

另一方面,对于PhP、Node、Python、Ruby等高级解释型语言,共享库可以提供高性能原生模块,在服务器高计算量任务中扮演重要角色。

作者: V

Web Dev

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s