Связывание с .so файлами (webkit) - PullRequest
1 голос
/ 28 ноября 2009

Я пытаюсь создать программу, которая использует часть кода из WebKit / GTK +. В частности, я хочу загрузить строку, использовать синтаксический анализатор WebKit для создания дерева DOM, а затем выполнить итерацию по этому дереву.

Я пытаюсь использовать класс с именем HTMLDocument. WebKit / GTK + не раскрывает это как часть своего API, и я сталкиваюсь с некоторыми проблемами, связанными с ним.

Я могу собрать WebKit / GTK + нормально, что дает мне файл с именем: libwebkit-1.0.so. Моя программа:

#include <iostream>
#include <WebCore/config.h>
#include <WebCore/html/HTMLDocument.h>

using namespace WebCore;

int main() {
    String title = "test";

    RefPtr<HTMLDocument> d = HTMLDocument::create(0);
    d->open();
    d->write("<!doctype html><html><head><title>" + title + "</title></head><body></body></html>");
}

Это прекрасно компилируется (я использую те же директивы include, которые использует webkit для сборки), но приводит к ошибкам компоновки.

...test_doc.cpp:18: undefined reference to `WebCore::String::String(char const*)'
...test_doc.cpp:21: undefined reference to WebCore::Document::open(WebCore::Document*)'
...(similar for every function I use)

Если я бегу:

nm -C .libs/libwebkit-1.0.so | grep 'WebCore::Document::open'

Понятно:

003b1830 T WebCore::Document::open(WebCore::Document*)

, который указывает на то, что функция доступна. У меня есть достаточный опыт работы с C ++, но не очень много опыта со связыванием файлов в Linux.

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

Большое спасибо.

Использование: Ubuntu 9.10 g ++ 4.4.1

g ++ вызывается с:

g++ --debug -DHAVE_CONFIG_H -I.   `pkg-config --cflags libsoup-2.4` \
-DBUILDING_CAIRO__=1 -DBUILDING_GTK__=1 -DWTF_CHANGES -DWTF_USE_ICU_UNICODE=1 \
-DNDEBUG   -I./WebCore -I./WebCore/accessibility -I./WebCore/bindings/js \ 
-I./WebCore/bridge -I./WebCore/bridge/c -I./WebCore/css -I./WebCore/dom \
...many more webkit include directories...
 -DDATA_DIR=\"/usr/local/share\" \
 test_doc.cpp -o test_doc.out \
./webkit-1.1.15.3/.libs/libwebkit-1.0.so

(я получаю тот же результат с -L / path / to / lib -lwebkit-1.0)

Ответы [ 3 ]

2 голосов
/ 28 ноября 2009

Я думаю, что вы можете столкнуться с проблемой упорядочения: man g++ указывает, что порядок опции -l является значительным, и по памяти компоновщик будет искать только символы в объектах, которые предшествовали текущему файлу команды линия.

Я подозреваю, что происходит то, что компоновщик пытается связать test_doc, прежде чем он увидит libwebkit-1.0.so, поэтому он еще не видел ни одного из этих символов и выдает залог.

1 голос
/ 08 декабря 2009

Вы должны использовать -L/path/to/web и -lwebkit-1.0. Кроме того, я бы скомпилировал ваш файл .cpp в .o, а затем собрал ваш исполняемый файл отдельно, чтобы убедиться, что все изолировано.

В любом случае, вам может потребоваться установить переменную окружения $LD_LIBRARY_PATH, указав путь к этому .so. Если вы ссылаетесь на общую библиотеку, она вам понадобится во время выполнения. Следовательно, вы не хотите, чтобы ваш SO Webkit хранился в его каталоге сборки (build / .libs). Вы хотите установить его. Если вы не root, вам нужно ./configure с --prefix=/some/path, чтобы установить его в какой-нибудь локальный каталог. Кроме того, вы можете связать со статической библиотекой. Один из способов сделать это - использовать флаг -bstatic (или аналогичный) перед вашим -lwebkit-1.0.

Этот является хорошим ресурсом для создания и использования библиотеки Linux.

0 голосов
/ 04 декабря 2009

Я думаю, что проблема в том, что нужные вам символы не экспортируются. Вы можете сделать objdump --dynamic-syms libwebkit-1.0.so, чтобы увидеть, какие символы доступны. В файлах сборки WebKit GTK используется флаг -fvisibility=hidden для ограничения символов. Проверьте сгенерированный GNUMakefile, и вы увидите SYMBOL_VISIBILITY = -fvisibility=hidden. Вы должны иметь возможность изменять файлы сборки, чтобы получить то, что вам нужно.

...