我正在尝试为C ++课程编写一个小类库。
我想知道是否可以在我的共享对象中定义一组类,然后直接在我的主程序中使用它们来演示库。有任何技巧吗?我记得很久以前(在我开始编程之前)读过这个C ++类只能用于MFC .dll而不是普通的,但那只是windows端。
答案 0 :(得分:13)
C ++类在.so共享库中运行良好(它们也适用于Windows上的非MFC DLL,但这不是你的问题)。它实际上比Windows更容易,因为您不必显式地从库中导出任何符号。
本文档将回答您的大部分问题:http://people.redhat.com/drepper/dsohowto.pdf
要记住的主要事项是在编译时使用-fPIC
选项,在链接时使用-shared
选项。你可以在网上找到很多例子。
答案 1 :(得分:7)
这是我的解决方案,它符合我的预期。
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
$
答案 2 :(得分:3)
据我了解,只要您链接.so文件,这些都是使用相同的编译器编译的,这很好。不同的编译器以不同的方式破坏符号,并且无法链接。
这是在Windows上使用COM的优势之一,它定义了将OOP对象放入DLL中的标准。我可以使用GNU g ++编译DLL并将其链接到用MSVC编译的EXE - 甚至是VB!