在.so库中使用C ++类
时间:2020-03-05 18:51:58 来源:igfitidea点击:
我正在尝试为C ++课程编写一个小型的类库。
我想知道是否有可能在共享对象中定义一组类,然后在演示该库的主程序中直接使用它们。有技巧吗?我记得很早以前(在我开始真正编程之前)读过这篇文章,即C ++类仅适用于MFC .dll,而不适用于普通的.dll,但这只是Windows的一面。
解决方案
回答
C ++类可以在.so共享库中正常工作(它们也可以在Windows上的非MFC DLL中工作,但这并不是我们真正的问题)。实际上,它比Windows简单,因为我们不必从库中显式导出任何符号。
本文档将回答大多数问题:http://people.redhat.com/drepper/dsohowto.pdf
要记住的主要事情是在编译时使用-fPIC选项,在链接时使用-shared选项。我们可以在网上找到很多示例。
回答
据我了解,这很好,只要我们链接所有使用同一编译器编译的.so文件。不同的编译器以不同的方式处理符号,并且将无法链接。
这是在Windows上使用COM的优点之一,它定义了将OOP对象放入DLL中的标准。我可以使用GNU g ++编译DLL,并将其链接到使用MSVC甚至VB编译的EXE!
回答
这是我的解决方案,它确实达到了我的期望。
代码
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 $