Создать общую библиотеку, используя другую общую библиотеку - PullRequest
1 голос
/ 17 ноября 2009

У меня есть общая библиотека "libwiston.so". Я использую это для создания другой общей библиотеки с именем "libAnimation.so", которая будет использоваться другим проектом. Теперь вторая библиотека "libAnimation.so" не может быть правильно использована в тестовом коде. Поэтому я сомневаюсь, что создание второй библиотеки libAnimation.so является правильным. Команда gcc для создания этой библиотеки

 g++ -g -shared -Wl,-soname,libwiston.so -o libAnimation.so $(objs) -lc". 

Кто-нибудь сталкивался с этой проблемой?

Ответы [ 2 ]

3 голосов
/ 17 ноября 2009

Это похоже на странную линию связи - вы создаете libAnimation.so, но его внутреннее DT_SONAME имя libwiston.so.

Я не думаю, что ты хотел это сделать. Разве вы не хотите связать libAnimation.so с libwiston.so (-lwiston)?

g++ -g -shared -o libAnimation.so $(objs) -lc -lwiston

Я думаю, что было бы проще обернуть вашу сборку в automake / autoconf и полагаться на libtool для правильного создания общей библиотеки.

0 голосов
/ 25 октября 2010

Я сделаю скромный обзор процесса создания общих библиотек.

Давайте начнем с создания 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...