9

C++ コース用の小さなクラス ライブラリを作成しようとしています。

共有オブジェクトで一連のクラスを定義し、それらをライブラリのデモを行うメイン プログラムで直接使用できるかどうか疑問に思っていました。関連するトリックはありますか?私はずっと前に (実際にプログラミングを始める前に)、C++ クラスは MFC の .dll でのみ動作し、単純な .dll では動作しないということを読んだことを覚えていますが、それは単なる Windows 側です。

4

3 に答える 3

12

C++ クラスは .so 共有ライブラリで正常に動作します (Windows の非 MFC DLL でも動作しますが、それは実際には問題ではありません)。ライブラリからシンボルを明示的にエクスポートする必要がないため、実際には Windows よりも簡単です。

このドキュメントは、あなたの質問のほとんどに答えます: http://people.redhat.com/drepper/dsohowto.pdf

覚えておくべき主なことは-fPIC、コンパイル時にオプションを使用し、-sharedリンク時にオプションを使用することです。ネット上でたくさんの例を見つけることができます。

于 2008-09-12T01:01:22.997 に答える
10

私の解決策/テスト

ここに私の解決策があり、それは私が期待したことを行います。

コード

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
$
于 2008-09-12T02:12:30.297 に答える
3

私が理解しているように、同じコンパイラを使用してすべてコンパイルされた .so ファイルをリンクしている限り、これは問題ありません。さまざまなコンパイラがさまざまな方法でシンボルをマングルし、リンクに失敗します。

これは、Windows で COM を使用する利点の 1 つであり、OOP オブジェクトを DLL に配置するための標準を定義します。GNU g++ を使用して DLL をコンパイルし、MSVC または VB でコンパイルされた EXE にリンクできます。

于 2008-09-12T01:24:03.627 に答える