Я пытаюсь создать программу, которая использует часть кода из 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)