从 C++ 调用共享库
Posted
技术标签:
【中文标题】从 C++ 调用共享库【英文标题】:Calling a shared library from c++ 【发布时间】:2016-04-26 17:06:24 【问题描述】:我有一个共享库,其中存储了一些函数。我想通过从另一个程序调用该库来访问这些函数。我之前在 C 中已经这样做了。
现在我想用 C++ 做同样的事情。我对 C++ 很陌生,非常需要任何建议。顺便说一句,共享库是用 C 编写的。我是否仍然可以在 C++ 程序中调用它并使用它的所有功能。 请帮我。一个示例程序会非常有帮助。
我使用的是 ubuntu 14.04,编译器是自带的原生 g++。
【问题讨论】:
如果您edit 您的问题包含更多详细信息,例如哪个开发环境(编译器、链接器等)以及可能的操作系统,那么它可能询问模组(通过按下 [flag] 按钮)将此问题转移到堆栈溢出。正如目前所写的那样,由于缺乏细节,我怀疑它会很快关闭。 绝对是操作系统特定的。在 Windows 中执行此操作的方式与在 Linux 中执行此操作的方式完全一样。 google.com/… @StevenBurnap 感谢链接人。我提出这个问题的想法是,有人已经这样做了很多次并且可以提供一个例子。 How to call a function from a shared library? 【参考方案1】:使用dlopen 加载共享库,并使用dlsym 加载给定符号。链接-ldl
。
所以给定一个共享库hello.cpp,编译g++ -shared -fPIC -o libhello.so hello.cpp
#include <cstdio>
extern "C" void hello( const char* text )
printf("Hello, %s\n", text);
(共享库应命名为lib*.so[.*]
)
现在调用main.cpp,编译:g++ -o main main.cpp -ldl
#include <dlfcn.h>
extern "C" typedef void (*hello_t)( const char* text );
int main()
void* lib = dlopen("./libhello.so", RTLD_LAZY);
hello_t hello = (hello_t)dlsym( lib, "hello" );
hello("World!");
dlclose(lib);
见C++ dlopen mini HOWTO。
【讨论】:
【参考方案2】:你说你已经在 C 中这样做了。实际上 C++ 是基于 C 的,所以你仍然可以像以前那样做。
通常需要以下步骤:
在您的 c++ 代码中使用库提供的一些方法 找出提供该方法的标头,并将其包含在您的 .cpp 文件中 根据库的头文件(Makefile 中的编译器标志)编译 C++ 代码 链接到库(Makefile 中的链接器标志)【讨论】:
以上是关于从 C++ 调用共享库的主要内容,如果未能解决你的问题,请参考以下文章