C++ 链接.so文件(webkit)
我正在尝试创建一个使用WebKit/GTK+中的一些代码的程序。具体来说,我想加载一个字符串,使用WebKit的解析器构建一个DOM树,然后在该树上迭代 我正在尝试使用一个名为HTMLDocument的类。WebKit/GTK+没有将此作为其API的一部分公开,因此我在链接时遇到了一些问题 我能够正常地构建WebKit/GTK+,这给了我一个名为:libwebkit-1.0.so的文件。我的计划是:C++ 链接.so文件(webkit),c++,unix,webkit,g++,linker,C++,Unix,Webkit,G++,Linker,我正在尝试创建一个使用WebKit/GTK+中的一些代码的程序。具体来说,我想加载一个字符串,使用WebKit的解析器构建一个DOM树,然后在该树上迭代 我正在尝试使用一个名为HTMLDocument的类。WebKit/GTK+没有将此作为其API的一部分公开,因此我在链接时遇到了一些问题 我能够正常地构建WebKit/GTK+,这给了我一个名为:libwebkit-1.0.so的文件。我的计划是: #include <iostream> #include <WebCore/c
#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>");
}
如果我跑步:
nm -C .libs/libwebkit-1.0.so | grep 'WebCore::Document::open'
我明白了:
003b1830 T WebCore::Document::open(WebCore::Document*)
这似乎表明该功能可用。我有一个合理的C++经验,但是在Linux下链接文件的经验不多。p>
我并不期望这个问题能得到解决,但我希望如果我有概念上的问题,有人能纠正我。我的主要问题是,当我链接一个.so文件时,为什么会看到“undefined reference”错误,该文件将该函数列为正在定义的函数。是否需要另一个文件或生成步骤
多谢各位
使用:
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得到了相同的结果)我认为您可能遇到了排序问题:
man g++
指定-L选项的顺序是重要的,并且从内存中链接器将只查找在命令行上位于当前文件之前的对象中的符号
我怀疑发生的情况是,链接器试图在看到libwebkit-1.0.so之前链接test_doc,因此它还没有看到任何这些符号并退出。我认为您的问题是您需要的符号没有导出。您可以执行
objdump--dynamic syms libwebkit-1.0。因此
可以查看哪些符号可用。在WebKit GTK构建文件中,使用-fvisibility=hidden
标志来限制符号。检查生成的gnumake文件,您将看到SYMBOL\u VISIBILITY=-fvisibility=hidden
。您应该能够修改生成文件以获得所需的内容 您应该使用-L/path/to/web
和-lwebkit-1.0
。
另外,我会将您的.cpp文件编译成.o文件,然后分别构建您的可执行文件,以确保这些文件是独立的
无论如何,您可能需要设置$LD\u LIBRARY\u PATH
环境变量,以包括存储.so的路径。如果链接到共享库,则在运行时需要该库。因此,您不希望将webkit存储在其构建目录(build/.libs)中。你想安装它。如果您不是root用户,那么您应该使用--prefix=/some/path
配置,以将其安装到某个本地目录。或者,您可以链接静态库。一种方法是在-lwebkit-1.0
之前使用-bstatic
(或类似)标志
是创建和使用Linux库的良好资源。您是如何调用链接器/编译器的?我添加了g++命令,尽管它相当混乱,因为我需要复制许多webkit选项才能成功构建它。谢谢实际上,看起来“nm-D”(列出动态符号)并没有给我想要的输出。在进一步检查手册
时,我可能会将其完全颠倒过来。尽管如此,点菜还是一件愚蠢的事™, 因此,如果对静态归档非常重要,但对共享对象不重要,那么它可能值得检查。@RAOF-ordering。感谢RAOF的回复。我尝试重新排序链接参数,但结果相同。这与
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