Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么gcc链接器看不到我的析构函数?_C++_Gcc_Linker - Fatal编程技术网

C++ 为什么gcc链接器看不到我的析构函数?

C++ 为什么gcc链接器看不到我的析构函数?,c++,gcc,linker,C++,Gcc,Linker,我正试图按照中的说明在Linux机器上编译wkhtmltopdf qt 现在我陷入了链接器拒绝链接的困境。它打印了几个错误,但引起我注意的是: /home/ubuntu/wkhtmltopdf-qt/lib/libwebcore.a(AccessibilityRenderObject.o): In function `WebCore::AccessibilityRenderObject::~AccessibilityRenderObject()': AccessibilityRenderObje

我正试图按照中的说明在Linux机器上编译wkhtmltopdf qt

现在我陷入了链接器拒绝链接的困境。它打印了几个错误,但引起我注意的是:

/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()'
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
至少可以说这很奇怪。首先,因为链接器声称析构函数尝试引用自身,然后,因为它没有这样做!疯狂的东西。。。 不管怎样,一切似乎都被定义了。请注意:

ubuntu@ip-10-245-78-162:~$ 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()
ubuntu@ip-10-245-78-162:~/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());
}
最后,失败的链接器命令行是:

/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()'
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


有人能给我解释一下发生了什么吗?

编译命令包括以下选项:
-fffunction sections-fdata sections
(文档化)
-f函数节
将每个函数放在对象文件的自己的节中,而不是简单地将它们全部放在一个
.text
节中。类似地,
-fdata节
适用于全局/静态数据

其思想是,通过指定
--gc sections
(),链接器可以在将“不可访问”的部分合并到二进制文件的最终
.text
部分之前丢弃它们。简而言之,在不为每个函数使用单独编译单元的情况下减少代码大小

这就是预感。我本来希望它在没有
--gc节
选项的情况下工作。显然没有任何好处,因为没有任何东西会被丢弃。为什么会失败

当析构函数被实现时,GCC、CLAN等使用的C++ ABI通常生成3个析构函数变体,以:<代码> D0EV 、 D1EV D2EV、以及<代码> VTAB< /COD>和<代码> Type信息< /代码>数据为该类。我的猜测是,这些单独的部分没有正确地结合在一起。这是一个bug,还是链接器(或链接规范)的限制,我不知道



这在构建共享库时也没用,因为无法提前知道将使用哪些符号。编译器是通过
-fPIC
调用的,这应该是正常的,因为对象只是被存档。但是,
-fvisibility
选项可能会使问题复杂化。

编译命令包括选项:
-ffunction sections-fdata sections
(已记录)
-f函数节
将每个函数放在对象文件的自己的节中,而不是简单地将它们全部放在一个
.text
节中。类似地,
-fdata节
适用于全局/静态数据

其思想是,通过指定
--gc sections
(),链接器可以在将“不可访问”的部分合并到二进制文件的最终
.text
部分之前丢弃它们。简而言之,在不为每个函数使用单独编译单元的情况下减少代码大小

这就是预感。我本来希望它在没有
--gc节
选项的情况下工作。显然没有任何好处,因为没有任何东西会被丢弃。为什么会失败

当析构函数被实现时,GCC、CLAN等使用的C++ ABI通常生成3个析构函数变体,以:<代码> D0EV 、 D1EV D2EV、以及<代码> VTAB< /COD>和<代码> Type信息< /代码>数据为该类。我的猜测是,这些单独的部分没有正确地结合在一起。这是一个bug,还是链接器(或链接规范)的限制,我不知道



这在构建共享库时也没用,因为无法提前知道将使用哪些符号。编译器是通过
-fPIC
调用的,这应该是正常的,因为对象只是被存档。但是,
-fvisibility
选项可能会使问题复杂化。

如果在链接器命令中添加
-Wl,--gc节,会有什么不同吗?这真是神奇!成功了!请将其打包为答复,我会将其标记为答复。如果在链接器命令中添加
-Wl,--gc节
,会有什么不同吗?这真是神奇!成功了!请把它包装成答复,我会把它标记为答复。