【问题标题】:Linking with .so files (webkit)链接 .so 文件 (webkit)
【发布时间】:2009-11-28 01:53:32
【问题描述】:

我正在尝试创建一个使用 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 相同的包含指令来构建),但会导致链接错误。

...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 得到相同的结果)

【问题讨论】:

  • 你是如何调用链接器/编译器的?
  • 我添加了 g++ 命令,虽然它相当混乱,因为我需要复制许多 webkit 选项才能成功构建它。谢谢!
  • 实际上它看起来像“nm -D”(列出动态符号)没有给我想要的输出。

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


【解决方案1】:

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

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

【讨论】:

  • 嗯。在进一步检查man ld 时,我可能会完全倒退。尽管如此,订购仍然是一件愚蠢的事情,因此可能值得检查。
  • @RAOF - 如果对静态存档非常重要但对共享对象无关紧要,则排序。
  • 感谢 RAOF 的回复。我尝试重新排序链接参数,但结果相同。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多