Использование классов C ++ в библиотеках .so - PullRequest
9 голосов
/ 12 сентября 2008

Я пытаюсь написать небольшую библиотеку классов для курса C ++.

Мне было интересно, можно ли определить набор классов в моем общем объекте, а затем использовать их непосредственно в моей основной программе, которая демонстрирует библиотеку. Есть какие-нибудь хитрости? Я помню, как читал давно (до того, как я действительно начал программировать), что классы C ++ работали только с MFC .dll, а не с простыми, но это только сторона окна.

Ответы [ 3 ]

13 голосов
/ 12 сентября 2008

Классы C ++ прекрасно работают в разделяемых библиотеках .so (они также работают в не-MFC DLL в Windows, но это не ваш вопрос). На самом деле это проще, чем Windows, потому что вам не нужно явно экспортировать какие-либо символы из библиотек.

Этот документ ответит на большинство ваших вопросов: http://people.redhat.com/drepper/dsohowto.pdf

Главное, что нужно помнить, это использовать опцию -fPIC при компиляции и опцию -shared при компоновке. Вы можете найти множество примеров в сети.

7 голосов
/ 12 сентября 2008

Мое решение / тестирование

Вот мое решение, и оно делает то, что я ожидал.

код

кат.чч :

#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
$
3 голосов
/ 12 сентября 2008

Насколько я понимаю, это нормально, если вы связываете .so файлы, которые были скомпилированы с использованием одного и того же компилятора. Различные компиляторы манипулируют символами по-разному и не смогут установить связь.

Это одно из преимуществ использования COM в Windows, оно определяет стандарт для размещения объектов ООП в DLL. Я могу скомпилировать DLL с помощью GNU g ++ и связать ее с EXE-файлом, скомпилированным с MSVC - или даже с VB!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...