当前位置:  开发笔记 > 编程语言 > 正文

在.so库中使用C++类

如何解决《在.so库中使用C++类》经验,为你挑选了2个好方法。

我正在尝试为C++课程编写一个小类库.

我想知道是否有可能在我的共享对象中定义一组类,然后直接在我的主程序中使用它们来演示库.有任何技巧吗?我记得很久以前(在我开始编程之前)读过这个C++类只能用于MFC .dll而不是普通的,但这只是windows端.



1> Kristopher J..:

C++类在.so共享库中工作正常(它们也适用于Windows上的非MFC DLL,但这不是你的问题).它实际上比Windows更容易,因为您不必显式地从库中导出任何符号.

本文档将回答您的大部分问题:http://people.redhat.com/drepper/dsohowto.pdf

要记住的主要事项是-fPIC在编译时使用选项,-shared在链接时使用选项.你可以在网上找到很多例子.



2> Flame..:
我的解决方案/测试

这是我的解决方案,它符合我的预期.

cat.hh:

#include 

class Cat
{
    std::string _name;
public:
    Cat(const std::string & name);
    void speak();
};

cat.cpp:

#include 
#include 

#include "cat.hh"

using namespace std;

Cat::Cat(const string & name):_name(name){}
void Cat::speak()
{
    cout << "Meow! I'm " << _name << endl;
}

main.cpp:

#include 
#include 
#include "cat.hh"

using std::cout;using std::endl;using std::string;
int main()
{
    string name = "Felix";
    cout<< "Meet my cat, " << name << "!" <

汇编

您首先编译共享库:

$ g++ -Wall -g -fPIC -c cat.cpp
$ g++ -shared -Wl,-soname,libcat.so.1 -o libcat.so.1 cat.o

然后使用库中的类编译主可执行文件或C++程序:

$ g++ -Wall -g -c main.cpp
$ g++ -Wall -Wl,-rpath,. -o main main.o libcat.so.1 # -rpath linker option prevents the need to use LD_LIBRARY_PATH when testing
$ ./main
Meet my cat, Felix!
Meow! I'm Felix
$


此代码显示为跨共享库的C++类的"陷阱"之一.通过在'shared'接口中使用STL类意味着库和应用程序都在编译它们自己的STL类'string'的实现.如果这两个项目在同一台机器上使用相同的编译器同时编译,那么它们看起来都很好.编译库,等待18个月,然后编译应用程序,它可能会工作.但是没有保证.将二进制文件中的共享库分发给其他开发人员,您将遇到"问题"
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有