使用C++;.so库中的类 我试图为C++课程编写一个小类库。

使用C++;.so库中的类 我试图为C++课程编写一个小类库。,c++,linux,class-library,C++,Linux,Class Library,我想知道是否有可能在共享对象中定义一组类,然后在演示库的主程序中直接使用它们。有什么把戏吗?我记得很久以前(在我开始真正编程之前),C++类只使用MFC .DLL而不是纯的,但是这只是Windows方面。 C++类在共享库中工作得很好(它们也在Windows上的非MFC DLL中工作,但这不是你真正的问题)。它实际上比Windows更容易,因为您不必显式地从库中导出任何符号 本文档将回答您的大部分问题: 要记住的主要事项是编译时使用-fPIC选项,链接时使用-shared选项。你可以在网上找到

我想知道是否有可能在共享对象中定义一组类,然后在演示库的主程序中直接使用它们。有什么把戏吗?我记得很久以前(在我开始真正编程之前),C++类只使用MFC .DLL而不是纯的,但是这只是Windows方面。

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

本文档将回答您的大部分问题:


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

据我所知,只要你链接使用同一个编译器编译的.so文件,就可以了。不同的编译器以不同的方式损坏符号,将无法链接

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

我的解决方案/测试 这是我的解决方案,它实现了我的预期

代码 类别hh:

然后使用库中的类编译主可执行程序或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
$

对此有一个警告:如果使用(a)符号匹配方案匹配或(b)你有一些<代码> ExtCn/Cuff>函数用作API胶,则可以使用包含不同编译器编译的C++代码的共享库。C++代码显示了共享库中C++类的“GOCHAs”之一。通过在“共享”接口中使用STL类,意味着库和应用程序各自编译自己的STL类“字符串”实现。如果这两个项目同时在同一台机器上使用同一个编译器进行编译,那么一切看起来都很好。编译库,等待18个月,然后编译应用程序,它可能会工作。但这并不能保证。将您的共享库以二进制形式分发给其他开发人员,您将遇到“问题”,正如其他人所建议的那样,这种方法是有缺陷的,因为编译器之间的名称差异。我发现了一个很好的资源,它显示了正确的方法(第3.3节):
#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;
}
#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
$ 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
$