О символе vtable может быть не определено, потому что в классе отсутствует функция ключа - PullRequest
0 голосов
/ 24 декабря 2018

Я хочу отладить собственный исходный код Android, поэтому я изменяю уровень оптимизации clang -Os -> -O0 ошибка:

frameworks / native / services / surfaceflinger / DisplayHardware / HWComposer_hwc1.h: 171: ошибка: неопределенная ссылка на «vtable for android :: HWComposer :: 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 для 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 для android :: HWComposer ::Предварительная сборка HWCLayerInterface '/ gcc / linux-x86 / aarch64 / aarch64-linux-android-4.9 / aarch64-linux-android / bin / ld.gold: символ vtable может быть неопределенным, поскольку в классе отсутствует его ключевая функция (см. Go /отсутствующий метод) frameworks / native / services / surfaceflinger / DisplayHardware / HWComposer_hwc1.h: 171: ошибка: неопределенная ссылка на 'vtable для android :: HWComposer :: HWCLayerInterface' prebuilts / gcc / linux-x86 / aarch64 / aarch64-linux-android- 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: ошибка: неопределенная ссылка на «android :: HWComposer :: HWCLayerInterface :: setDataspace (целевой продукт / android_dataspace)» // rk3399_box / объект / SHARED_LIBRARIES / libsurfaceflinger_intermediates / ДИСПЛЕЙyHardware / HWComposer_hwc1.o: frameworks / native / services / surfaceflinger / DisplayHardware / HWComposer_hwc1.cpp: vtable для android :: HWComposer :: HWCLayer: ошибка: неопределенная ссылка на 'android :: HWComposer :: HWCLayerInatas_Direct_Directory>clang ++: ошибка: команда компоновщика завершилась неудачно с кодом выхода 1 (используйте -v для просмотра вызова)

Я не хочу изменять исходный код Android, но хочу закрыть оптимизацию.

HWCLayerInterface:

    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:

    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() { }
    };

Итерируемый:

    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:

    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 или:

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;
    };

Эта ошибка не существует.

...