我想调试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:
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;
};此错误不存在。
发布于 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,以及何时适当地应用于类和/或重写函数。
https://stackoverflow.com/questions/53912118
复制相似问题