Я сделаю скромный обзор процесса создания общих библиотек.
Давайте начнем с создания libwiston.so . Сначала мы реализуем функцию, которую хотим экспортировать, а затем определяем ее в заголовке, чтобы другие программы знали, как ее вызвать.
/* file libwiston.cpp
* Implementation of hello_wiston(), called by libAnimation.so
*/
#include "libwiston.h"
#include <iostream>
int hello_wiston(std::string& msg)
{
std::cout << msg << std::endl;
return 0;
}
и
/* file libwiston.h
* Exports hello_wiston() as a C symbol.
*/
#include <string>
extern "C" {
int hello_wiston(std::string& msg);
};
Этот код может быть скомпилирован с: g++ libwiston.cpp -o libwiston.so -shared
Теперь мы реализуем вторую разделяемую библиотеку с именем libAnimation.so , которая вызывает функцию, экспортируемую первой библиотекой.
/* file libAnimation.cpp
* Implementation of call_wiston().
* This function is a simple wrapper around hello_wiston().
*/
#include "libAnimation.h"
#include "libwiston.h"
#include <iostream>
int call_wiston(std::string& param)
{
hello_wiston(param);
return 0;
}
и заголовок:
/* file libAnimation.h
* Exports call_wiston() as a C symbol.
*/
#include <string>
extern "C" {
int call_wiston(std::string& param);
};
Скомпилируйте его с помощью: g++ libAnimation.cpp -o libAnimation.so -shared -L. -lwiston
Наконец, мы создаем небольшое приложение для тестирования libAnimation.
/* file demo.cpp
* Implementation of the test application.
*/
#include "libAnimation.h"
int main()
{
std::string msg = "hello stackoverflow!";
call_wiston(msg);
}
И скомпилируйте его с помощью: g++ demo.cpp -o demo -L. -lAnimation
Существует интересный инструмент с именем nm , который вы можете использовать для отображения символов, экспортируемых вашей общей библиотекой. Используя эти примеры, вы можете выполнить следующие команды для проверки символов:
nm libAnimation.so | grep call_wiston
выходы:
00000634 t _GLOBAL__I_call_wiston
000005dc T call_wiston
, а также:
nm libwiston.so | grep hello_wiston
* * Тысяча сорок-одина выходы: * +1042 *
0000076c t _GLOBAL__I_hello_wiston
000006fc T hello_wiston