这是使用g
++
进行动态共享库编译的后续版本。
我正在尝试在Linux上的C++中创建一个共享的类库。当我尝试使用库中定义的类时,我的问题开始了。我链接到的第二篇教程展示了如何加载用于创建库中定义的类的对象的符号,但是没有_使用_ 这些对象来完成任何工作。
有谁知道用于创建共享C ++类库的更完整的教程,该教程还显示了如何在单独的可执行文件中 使用
这些类?一个非常简单的教程,显示了对象的创建,使用(简单的getter和setter方法就可以了)和删除将是很棒的。链接或引用某些开源代码来说明共享类库的使用也同样不错。
尽管来自codelogic和nimrodm的答案确实有用,但我只是想补充一点,因为提出了这个问题,所以我选择了《Beginning
LinuxProgramming》的副本,并且其第一章包含示例C代码以及有关创建和使用静态库和共享库的良好解释。
。这些示例可通过该书的旧版中的
Google图书搜索获得。
myclass.h
#ifndef __MYCLASS_H__
#define __MYCLASS_H__
class MyClass
{
public:
MyClass();
/* use virtual otherwise linker will try to perform static linkage */
virtual void DoSomething();
private:
int x;
};
#endif
myclass.cc
#include "myclass.h"
#include <iostream>
using namespace std;
extern "C" MyClass* create_object()
{
return new MyClass;
}
extern "C" void destroy_object( MyClass* object )
{
delete object;
}
MyClass::MyClass()
{
x = 20;
}
void MyClass::DoSomething()
{
cout<<x<<endl;
}
class_user.cc
#include <dlfcn.h>
#include <iostream>
#include "myclass.h"
using namespace std;
int main(int argc, char **argv)
{
/* on Linux, use "./myclass.so" */
void* handle = dlopen("myclass.so", RTLD_LAZY);
MyClass* (*create)();
void (*destroy)(MyClass*);
create = (MyClass* (*)())dlsym(handle, "create_object");
destroy = (void (*)(MyClass*))dlsym(handle, "destroy_object");
MyClass* myClass = (MyClass*)create();
myClass->DoSomething();
destroy( myClass );
}
在Mac OS X上,使用以下命令进行编译:
g++ -dynamiclib -flat_namespace myclass.cc -o myclass.so
g++ class_user.cc -o class_user
在Linux上,使用以下命令进行编译:
g++ -fPIC -shared myclass.cc -o myclass.so
g++ class_user.cc -ldl -o class_user
如果这是针对插件系统的,则可以将MyClass用作基类,并定义所有所需的虚拟函数。然后,插件作者将从MyClass派生,重写虚拟函数并实现create_object
和destroy_object
。您的主应用程序无需进行任何更改。
问题内容: 我正在尝试使用通过Cmake创建的Makefile在Linux中编译共享库,但是运行make会出现以下错误: 我在CMakeLists.txt中提供以下命令,以便说我想要共享(.so)库: 为了避免上面显示的-fPIC错误,我还需要指定什么? 提前谢谢 问题答案: 需要使用-fPIC编译boost库:请看一下:如何使用boost.python中的-fPIC编译静态库。 尝试在项目中按c
我试图在Linux中使用Cmake创建的Makefile编译一个共享库,但运行make时出现以下错误: 为了避免上面显示的-fpic错误,我还需要指定什么? 提前多谢
问题内容: 最近,我们被要求提供其中一个库的Linux版本,之前我们是在Linux下开发的,并已针对Windows发行,而在Windows上部署库通常要容易得多。我们遇到的问题是将导出的符号剥离为仅暴露界面中的符号。想要这样做的三个很好的理由 为了保护我们技术的专有方面,以免通过导出的符号被暴露。 防止用户遇到符号名称冲突的问题。 为了加快库的加载速度(至少有人告诉我)。 然后举一个简单的例子:
问题内容: 我有一个网站,该网站使用SVG进行交互式客户端thingamabob。我想提供下载完成输出的PDF的选项。我可以将最终的SVG输出传递回服务器,在这里我要转换为PDF,然后将其返回给客户端进行下载。 这将需要在无头共享linux服务器上工作,在该服务器上安装或编译既费劲又是不可能的。该网站是PHP,因此理想的解决方案是PHP,或使用易于安装在共享Web服务器上的软件。可以使用Pytho
问题内容: 我正在Linux下使用C ++开发共享库,并且我希望该库使用log4cxx进行日志记录。但是,我不确定该如何设置。为了使log4cxx正常工作,我需要创建一个记录器对象。我如何确保在加载库时创建了该对象? 我怀疑将记录器对象创建为全局变量,然后从我的库的任何源文件中使用它,在标头中将其声明为extern,将是最容易的。但是,一旦应用程序连接到库,如何自动创建记录器? 我知道在Windo
问题内容: 两个共享库liba.so和libb.so。liba.so使用libb.so。所有c文件都使用-fPIC编译。链接使用- shared。当我们在liba.so上调用dlopen时,它无法在libb.so中找到符号…我们得到“未定义符号”错误。我们可以dlopen libb.so没有错误。我们知道liba正在找到libb,因为我们没有得到文件未找到错误。删除libb.so时,出现文件未找到