2013-03-25 4 views
2

Я пытаюсь скомпилировать wkhtmltopdf-qt на машине Linux в соответствии с инструкциями от https://code.google.com/p/wkhtmltopdf/wiki/compilation.Почему gcc-компоновщик не видит моего деструктора?

Теперь я застрял с линкером, отказывающимся ссылаться. Он печатает несколько ошибок, но тот, который попался мне на глаза, выглядит следующим образом:

/home/ubuntu/wkhtmltopdf-qt/lib/libwebcore.a(AccessibilityRenderObject.o): In function `WebCore::AccessibilityRenderObject::~AccessibilityRenderObject()': 
AccessibilityRenderObject.cpp:(.text._ZN7WebCore25AccessibilityRenderObjectD0Ev+0x5): undefined reference to `WebCore::AccessibilityRenderObject::~AccessibilityRenderObject()' 

Это, как ни странно, странно. Во-первых, потому что компоновщик утверждает, что деструктор пытается ссылаться на себя, а затем - потому что он этого не делает! Сумасшедшие вещи ... В любом случае, все, кажется, определено. Пожалуйста, соблюдайте:

[email protected]:~$ nm --defined-only -C -A /home/ubuntu/wkhtmltopdf-qt/lib/libwebcore.a | grep ~AccessibilityRenderObject 
/home/ubuntu/wkhtmltopdf-qt/lib/libwebcore.a:AccessibilityRenderObject.o:0000000000000000 T WebCore::AccessibilityRenderObject::~AccessibilityRenderObject() 
/home/ubuntu/wkhtmltopdf-qt/lib/libwebcore.a:AccessibilityRenderObject.o:0000000000000000 T WebCore::AccessibilityRenderObject::~AccessibilityRenderObject() 
/home/ubuntu/wkhtmltopdf-qt/lib/libwebcore.a:AccessibilityRenderObject.o:0000000000000000 T WebCore::AccessibilityRenderObject::~AccessibilityRenderObject() 
[email protected]:~/wkhtmltopdf-qt/src/3rdparty/webkit/Source/WebCore/accessibility$ 

Далее, в файле AccessibilityRenderObject.cpp:

#include <wtf/unicode/CharacterNames.h> 

using namespace std; 

namespace WebCore { 

using namespace HTMLNames; 

AccessibilityRenderObject::AccessibilityRenderObject(RenderObject* renderer) 
    : AccessibilityObject() 
    , m_renderer(renderer) 
    , m_ariaRole(UnknownRole) 
    , m_childrenDirty(false) 
    , m_roleForMSAA(UnknownRole) 
{ 
    m_role = determineAccessibilityRole(); 

#ifndef NDEBUG 
    m_renderer->setHasAXObject(true); 
#endif 
} 

AccessibilityRenderObject::~AccessibilityRenderObject() 
{ 
    ASSERT(isDetached()); 
} 

Таким образом, деструктор определяется только штрафом. Но я пошел еще дальше - я снова собрал AccessibilityRenderObject.cpp, на этот раз остановился на препроцессоре. Конечно, как ад деструктор есть:

class AccessibilityRenderObject : public AccessibilityObject { 
protected: 
    AccessibilityRenderObject(RenderObject*); 
public: 
    static PassRefPtr<AccessibilityRenderObject> create(RenderObject*); 
    virtual ~AccessibilityRenderObject(); 
. 
. 
. 
AccessibilityRenderObject::~AccessibilityRenderObject() 
{ 
    ((void)0); 
} 

Компиляция линия используется для компиляции файла (как и многих других) это:

g++ -c -m64 -pipe -Wall -Wextra -Wreturn-type -fno-strict-aliasing -Wcast-align -Wchar-subscripts -Wformat-security -Wreturn-type -Wno-unused-parameter -Wno-sign-compare -Wno-switch -Wno-switch-enum -Wundef -Wmissing-noreturn -Winit-self -Wno-c++0x-compat -ffunction-sections -fdata-sections -O2 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -D_REENTRANT -DNDEBUG -DBUILDING_QT__=1 -DNDEBUG -DQT_ASCII_CAST_WARNINGS -DENABLE_XSLT=0 -DENABLE_WEB_TIMING=0 -DENABLE_JAVASCRIPT_DEBUGGER=1 -DENABLE_DATABASE=1 -DENABLE_EVENTSOURCE=1 -DENABLE_OFFLINE_WEB_APPLICATIONS=1 -DENABLE_DOM_STORAGE=1 -DENABLE_ICONDATABASE=1 -DENABLE_CHANNEL_MESSAGING=1 -DENABLE_DIRECTORY_UPLOAD=0 -DENABLE_FILE_SYSTEM=0 -DENABLE_QUOTA=0 -DENABLE_SQLITE=1 -DENABLE_DASHBOARD_SUPPORT=0 -DENABLE_FILTERS=1 -DENABLE_XPATH=1 -DENABLE_WCSS=0 -DENABLE_SHARED_WORKERS=1 -DENABLE_WORKERS=1 -DENABLE_XHTMLMP=0 -DENABLE_DETAILS=1 -DENABLE_METER_TAG=1 -DENABLE_PROGRESS_TAG=1 -DENABLE_BLOB=1 -DENABLE_NOTIFICATIONS=1 -DENABLE_INPUT_SPEECH=0 -DENABLE_INSPECTOR=1 -DENABLE_3D_RENDERING=1 -DENABLE_WEB_AUDIO=0 -DENABLE_WEBGL=0 -DENABLE_MEDIA_STATISTICS=0 -DENABLE_VIDEO_TRACK=0 -DENABLE_TOUCH_ICON_LOADING=0 -DENABLE_ANIMATION_API=0 -DENABLE_SVG=1 -DENABLE_SVG_FONTS=1 -DENABLE_SVG_FOREIGN_OBJECT=1 -DENABLE_SVG_ANIMATION=1 -DENABLE_SVG_AS_IMAGE=1 -DENABLE_SVG_USE=1 -DENABLE_DATALIST=1 -DENABLE_TILED_BACKING_STORE=1 -DENABLE_NETSCAPE_PLUGIN_API=1 -DENABLE_WEB_SOCKETS=1 -DWTF_USE_QT_BEARER=1 -DENABLE_TOUCH_EVENTS=1 -DENABLE_VIDEO=0 -DENABLE_VIDEO=0 -DSQLITE_CORE -DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_OMIT_COMPLETE -DXP_UNIX -DENABLE_NETSCAPE_PLUGIN_METADATA_CACHE=1 -DBUILDING_JavaScriptCore -DBUILDING_WTF -DBUILDING_WEBKIT -DQT_MAKEDLL -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../../../../../mkspecs/linux-g++-64 -I. -I../../../../../include/QtCore -I../../../../../include/QtNetwork -I../../../../../include/QtGui -I../../../../../include -I../JavaScriptCore -I../../Source -I../ThirdParty -I../JavaScriptCore/assembler -I../JavaScriptCore/bytecode -I../JavaScriptCore/bytecompiler -I../JavaScriptCore/heap -I../JavaScriptCore/dfg -I../JavaScriptCore/debugger -I../JavaScriptCore/interpreter -I../JavaScriptCore/jit -I../JavaScriptCore/parser -I../JavaScriptCore/profiler -I../JavaScriptCore/runtime -I../JavaScriptCore/wtf -I../JavaScriptCore/wtf/gobject -I/home/ubuntu/wkhtmltopdf-qt/src/3rdparty/webkit/Source/JavaScriptCore/wtf/symbian -I../JavaScriptCore/wtf/unicode -I../JavaScriptCore/yarr -I../JavaScriptCore/API -I../JavaScriptCore/ForwardingHeaders -I../JavaScriptCore/generated -Ibridge/qt -Ipage/qt -Iplatform/graphics/qt -Iplatform/network/qt -Iplatform/qt -I../WebKit/qt/Api -I../WebKit/qt/WebCoreSupport -I. -Iaccessibility -Ibindings -Ibindings/generic -Ibridge -Icss -Idom -Idom/default -Iediting -Ifileapi -Ihistory -Ihtml -Ihtml/canvas -Ihtml/parser -Ihtml/shadow -Iinspector -Iloader -Iloader/appcache -Iloader/archive -Iloader/cache -Iloader/icon -Imathml -Inotifications -Ipage -Ipage/animation -Iplatform -Iplatform/animation -Iplatform/audio -Iplatform/graphics -Iplatform/graphics/filters -Iplatform/graphics/filters/arm -Iplatform/graphics/texmap -Iplatform/graphics/transforms -Iplatform/image-decoders -Iplatform/leveldb -Iplatform/mock -Iplatform/network -Iplatform/sql -Iplatform/text -Iplatform/text/transcoder -Iplugins -Irendering -Irendering/mathml -Irendering/style -Irendering/svg -Istorage -Isvg -Isvg/animation -Isvg/graphics -Isvg/graphics/filters -Isvg/properties -Itesting -Iwebaudio -Iwebsockets -I/home/ubuntu/wkhtmltopdf-qt/src/3rdparty/webkit/Source/WebCore/wml -Iworkers -Ixml -Ibridge/jsc -Ibindings/js -I/home/ubuntu/wkhtmltopdf-qt/src/3rdparty/webkit/Source/WebCore/bindings/js/specialization -Ibridge/c -Itesting/js -Igenerated -I../../Source -I../../include -I../include/QtWebKit -I../include -I../../../sqlite -I/usr/X11R6/include -I.moc/release-static -o .obj/release-static/AccessibilityRenderObject.o accessibility/AccessibilityRenderObject.cpp 

Наконец, командная строка линкера, которая не эта :

g++ -Wl,-rpath-link,/home/ubuntu/wkhtmltopdf-qt/lib -m64 -Wl,-O1 -Wl,-rpath,/home/ubuntu/wkhtmltopdf-qt/src/3rdparty/webkit/Source/lib -Wl,-rpa 
th,/home/ubuntu/wkqt/lib -Wl,-rpath,/home/ubuntu/wkqt/lib -o tst_qwebframe .obj/release-static/tst_qwebframe.o .obj/release-static/qrc_tst_qweb 
frame.o -L/home/ubuntu/wkhtmltopdf-qt/lib -L/usr/X11R6/lib64 -L/home/ubuntu/wkhtmltopdf-qt/lib -lQtWebKit -L../../WebCore/release -L../../Ja 
vaScriptCore/release -L/usr/X11R6/lib64 -Wl,--start-group -lwebcore -lQtWebKit -Wl,--end-group -ljscore -lQtTest -lQtGui -lXrender -lXext -lX11 
-lQtNetwork -lQtCore -lm -ldl -lrt -lpthread -lXrender -lXext -lX11 -lm 

И все ошибки компоновщика, относящиеся к вышеупомянутому деструктора являются:

/home/ubuntu/wkhtmltopdf-qt/lib/libwebcore.a(AccessibilityRenderObject.o): In function `WebCore::AccessibilityRenderObject::~AccessibilityRenderObject()': 
AccessibilityRenderObject.cpp:(.text._ZN7WebCore25AccessibilityRenderObjectD2Ev+0x3): undefined reference to `vtable for WebCore::AccessibilityRenderObject' 
/home/ubuntu/wkhtmltopdf-qt/lib/libwebcore.a(AccessibilityRenderObject.o): In function `WebCore::AccessibilityRenderObject::~AccessibilityRenderObject()': 
AccessibilityRenderObject.cpp:(.text._ZN7WebCore25AccessibilityRenderObjectD0Ev+0x5): undefined reference to `WebCore::AccessibilityRenderObject::~AccessibilityRenderObject()' 

Есть много подозрительных ошибок линкера, как:

/home/ubuntu/wkhtmltopdf-qt/lib/libwebcore.a(AccessibilityMenuList.o):(.data.rel.ro._ZTIN7WebCore21AccessibilityMenuListE[typeinfo for WebCore: 
:AccessibilityMenuList]+0x10): undefined reference to `typeinfo for WebCore::AccessibilityRenderObject' 

Но, насколько я могу видеть все виртуальные функции должным образом объявлены и определены и не Makefile всего дерева исходных текстов не упоминает RTTI в все.

Может кто-нибудь объяснить мне, что происходит?

+0

Любая разница, если вы добавите '-Wl, -gc-sections' в команду компоновщика? –

+0

Это волшебство! Это сработало! Пожалуйста, упакуйте его как ответ, и я пометю его как ответ. – mark

ответ

4

В команду компиляции вносятся следующие параметры: -ffunction-sections -fdata-sections (задокументировано here). -ffunction-sections помещает каждую функцию в свой раздел объектного файла, а не просто помещает их все в один раздел .text. Аналогично, -fdata-sections применяется к глобальным/статическим данным.

Идея заключается в том, что, указав --gc-sections (garbage collection of unused input sections), линкер может отказаться от «» недостижимые секции, прежде чем их коалесценции в окончательный .text части двоичного файла. Короче говоря, чтобы уменьшить размер кода без использования отдельных единиц компиляции для каждой функции.

Так что это была догадка. Я бы ожидал, что он будет работать без опции --gc-sections независимо. Очевидно, что никакой выгоды не будет, поскольку ничего не будет отброшено. Почему это терпит неудачу?

Когда деструктор реализован, C++ ABI используется gcc, clang и т. Д., обычно генерирует 3 варианта деструктора, заканчивая: D0Ev, D1Ev, D2Ev, а также vtable и typeinfo данные для этого класса. Я предполагаю, что эти отдельные разделы не слиты правильно. Является ли это ошибкой или ограничением компоновщика (или спецификации ссылки), я не знаю.


Это также бесполезно при построении совместно библиотеки, так как нет никакого способа узнать заранее, какие будут использоваться символы. Компилятор вызывается с -fPIC, что должно быть хорошо, поскольку объекты просто архивируются. Однако параметры -fvisibility могут затруднить проблему.

Смежные вопросы