首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >因为类缺少它的键函数,所以可能未定义vtable符号。

因为类缺少它的键函数,所以可能未定义vtable符号。
EN

Stack Overflow用户
提问于 2018-12-24 10:23:51
回答 1查看 3.7K关注 0票数 0

我想调试android本机源代码,所以我更改了clang优化级别-Os -> -O0错误:

frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.h:171:error:未定义引用'vtable for android::HWComposer::HWCLayerInterface‘prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold: vtable符号可能是未定义的,因为类缺少其键函数(请参阅go/missingkeymethod) frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.h:171:错误:未定义的引用’vtable for android::HWCLayerInterface‘prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold: vtable符号可能未定义,因为类缺少其关键功能(请参阅go/missingkeymethod),frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.h:171:错误:未定义对'vtable for android::HWCLayerInterface::HWCLayerInterface’预构建/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold: vtable符号可能是未定义的,因为类缺少其关键函数(请参阅go/missingkeymethod),frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.h:171:错误:对'vtable for android::HWComposer::HWCLayerInterface‘prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin/ld.gold:的未定义引用vtable符号可能是未定义的,因为类缺少其键函数(请参阅go/missingkeymethod),out/target/product/rk3399_box/obj/SHARED_LIBRARIES/libsurfaceflinger_intermediates/DisplayHardware/HWComposer_hwc1.o:frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp:vtable用于android::Iterable: error:未定义的对'android::HWComposer::HWCLayerInterface::setDataspace(android_dataspace)‘out/target/product/rk3399_box/obj/SHARED_LIBRARIES/libsurfaceflinger_的引用intermediates/DisplayHardware/HWComposer_hwc1.o:frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp:vtable for 'android::HWComposer::HWCLayerInterface::setDataspace(android_dataspace)‘::HWCLayer::HWCLayer: error:对’android::HWComposer::HWCLayerInterface::setDataspace(android_dataspace)‘的未定义引用: clang++:linker命令在退出代码1中失败(使用-v查看调用)

我不想修改android源代码,但我想关闭优化。

HWCLayerInterface:

代码语言:javascript
复制
    class HWCLayerInterface {
    protected:
        virtual ~HWCLayerInterface() { }
    public:
        virtual int32_t getCompositionType() const = 0;
        virtual uint32_t getHints() const = 0;
        virtual sp<Fence> getAndResetReleaseFence() = 0;
        virtual void setDefaultState() = 0;
        virtual void setSkip(bool skip) = 0;
        virtual void setIsCursorLayerHint(bool isCursor = true) = 0;
        virtual void setBlending(uint32_t blending) = 0;
        virtual void setTransform(uint32_t transform) = 0;
        virtual void setFrame(const Rect& frame) = 0;
        virtual void setCrop(const FloatRect& crop) = 0;
        virtual void setVisibleRegionScreen(const Region& reg) = 0;
        virtual void setSurfaceDamage(const Region& reg) = 0;
        virtual void setSidebandStream(const sp<NativeHandle>& stream) = 0;
        virtual void setBuffer(const sp<GraphicBuffer>& buffer) = 0;
        virtual void setAcquireFenceFd(int fenceFd) = 0;
        virtual void setPlaneAlpha(uint8_t alpha) = 0;
        virtual void onDisplayed() = 0;
        virtual void setDataspace(android_dataspace_t dataspace);
    };

HWCLayer:

代码语言:javascript
复制
    class HWCLayer : public HWCLayerInterface {
        friend class LayerListIterator;
        // select the layer at the given index
        virtual status_t setLayer(size_t index) = 0;
        virtual HWCLayer* dup() = 0;
        static HWCLayer* copy(HWCLayer *rhs) {
            return rhs ? rhs->dup() : NULL;
        }
    protected:
        virtual ~HWCLayer() { }
    };

易碎的:

代码语言:javascript
复制
    template<typename CONCRETE, typename HWCTYPE>
    class Iterable : public HWComposer::HWCLayer {
    protected:
        HWCTYPE* const mLayerList;
        HWCTYPE* mCurrentLayer;
        Iterable(HWCTYPE* layer) : mLayerList(layer), mCurrentLayer(layer),
                mIndex(0) { }
        inline HWCTYPE const * getLayer() const { return mCurrentLayer; }
        inline HWCTYPE* getLayer() { return mCurrentLayer; }
        virtual ~Iterable() { }
        size_t mIndex;
    private:
        // returns a copy of ourselves
        virtual HWComposer::HWCLayer* dup() {
            return new CONCRETE( static_cast<const CONCRETE&>(*this) );
        }
        virtual status_t setLayer(size_t index) {
            mIndex = index;
            mCurrentLayer = &mLayerList[index];
            return NO_ERROR;
        }
    };

HWCLayerVersion1:

代码语言:javascript
复制
    class HWCLayerVersion1 : public Iterable<HWCLayerVersion1, hwc_layer_1_t> {
        struct hwc_composer_device_1* mHwc;
    public:
    ......
        virtual void setDataspace(android_dataspace_t dataspace) {
            getLayer()->reserved[0] = dataspace & 0xFF;
            getLayer()->reserved[1] = (dataspace >> 8) & 0xFF;
            getLayer()->reserved[2] = (dataspace >> 16) & 0xFF;
            getLayer()->reserved[3] = (dataspace >> 24) & 0xFF;
        }
    }

当我将优化级别更改为-O2或:

代码语言:javascript
复制
class HWCLayerInterface {
    protected:
        virtual ~HWCLayerInterface() { }
    public:
        virtual int32_t getCompositionType() const = 0;
        virtual uint32_t getHints() const = 0;
        virtual sp<Fence> getAndResetReleaseFence() = 0;
        virtual void setDefaultState() = 0;
        virtual void setSkip(bool skip) = 0;
        virtual void setIsCursorLayerHint(bool isCursor = true) = 0;
        virtual void setBlending(uint32_t blending) = 0;
        virtual void setTransform(uint32_t transform) = 0;
        virtual void setFrame(const Rect& frame) = 0;
        virtual void setCrop(const FloatRect& crop) = 0;
        virtual void setVisibleRegionScreen(const Region& reg) = 0;
        virtual void setSurfaceDamage(const Region& reg) = 0;
        virtual void setSidebandStream(const sp<NativeHandle>& stream) = 0;
        virtual void setBuffer(const sp<GraphicBuffer>& buffer) = 0;
        virtual void setAcquireFenceFd(int fenceFd) = 0;
        virtual void setPlaneAlpha(uint8_t alpha) = 0;
        virtual void onDisplayed() = 0;
        //change to default implemented
        virtual void setDataspace(android_dataspace_t dataspace) = 0;
    };

此错误不存在。

EN

回答 1

Stack Overflow用户

发布于 2019-09-19 19:45:30

= 0并不意味着默认实现,它意味着没有实现--您保留了对指针和对HWCLayerInterface的引用调用setDataspace的能力,但是没有HWCLayerInterface::setDataspace的实现。

如果您省略了= 0,那么您可以保证在某个地方有一个HWCLayerInterface::setDataspace的实现,并且链接器会期望它存在。您得到的错误是链接器告诉您,您承诺它实现该方法,但没有提供一个。

优化级别是不相关的,如果您声明一个方法但也没有定义它,那么C++代码是不正确的。

所以:

  • 如果您想要定义子必须覆盖的虚拟函数,请将其声明为= 0
  • 如果您想要定义一个虚拟函数,子函数可以覆盖,但是如果不重写函数,则不想做任何事情,那么声明它为空-例如,virtual void setDataspace(android_dataspace_t dataspace) {}

为了进行良好的维护,您应该将重写的任何内容标记为override。然后编译器将检查您是否确实重写了某些内容。这将保护您免受硬点排版和父类中无法跟踪的更改的影响,这两种方法都可以使您的尝试覆盖变成一些独立的功能。还可以查看final,以及何时适当地应用于类和/或重写函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53912118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档