链接.so文件(webkit)

时间:2009-11-28 01:53:32

标签: c++ unix webkit g++ linker

我正在尝试创建一个使用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>");
}

这编译很好(我使用webkit使用的相同include指令来构建),但会导致链接错误。

...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 个答案:

答案 0 :(得分:2)

我认为您可能遇到了排序问题:man g++指定-l选项的顺序是重要的,并且从内存中链接器将只查找当前文件之前的对象中的符号命令行。

我怀疑发生的事情是链接器试图在它看到libwebkit-1.0.so之前链接test_doc,所以它还没有看到任何这些符号和保释。

答案 1 :(得分:1)

您应该使用-L/path/to/web-lwebkit-1.0。 另外,我会将.cpp文件编译成.o,然后单独构建可执行文件以确保事物是孤立的。

无论如何,您可能需要设置$LD_LIBRARY_PATH环境变量以包含存储.so的路径。如果链接到共享库,则需要在运行时使用该库。因此,您不希望将webkit SO存储在其构建目录(build / .libs)中。你想安装它。如果您不是root用户,则应./configure使用--prefix=/some/path将其安装到某个本地目录。或者,您可以链接到静态库。一种方法是在-bstatic之前使用-lwebkit-1.0(或类似)标记。

This是Linux库创建和使用的好资源。

答案 2 :(得分:0)

我认为您的问题是您不需要导出所需的符号。您可以objdump --dynamic-syms libwebkit-1.0.so查看哪些符号可用。在WebKit GTK构建文件中,使用-fvisibility=hidden标志来限制符号。检查生成的GNUMakefile,您将看到SYMBOL_VISIBILITY = -fvisibility=hidden。您应该能够修改构建文件以获得所需内容。