在.so库中使用C ++类

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

我想知道是否可以在我的共享对象中定义一组类,然后直接在我的主程序中使用它们来演示库。 是否有任何诡计涉及? 我记得很久以前(在开始真正的编程之前)阅读这些C ++类只与MFC .dll一起使用,而不是简单的,但这只是Windows的一面。

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

这个文件将回答你的大部分问题: http : //people.redhat.com/drepper/dsohowto.pdf

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

我的解决方案/测试

这是我的解决方案,它是我所期望的。

cat.hh

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

cat.cpp

 #include <iostream> #include <string> #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 <iostream> #include <string> #include "cat.hh" using std::cout;using std::endl;using std::string; int main() { string name = "Felix"; cout<< "Meet my cat, " << name << "!" <<endl; Cat kitty(name); kitty.speak(); return 0; } 

汇编

你先编译共享库:

 $ 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 $ 

据我了解,只要你连接.so文件,这是所有编译使用相同的编译器,这是好的。 不同的编译器以不同的方式破坏了符号,并且不能链接。

这是在Windows上使用COM的优点之一,它定义了将OOP对象放入DLL中的标准。 我可以使用GNU g ++编译一个DLL,并将它链接到一个用MSVC编译的EXE,甚至是VB!