gpt4 book ai didi

c++ - 为什么链接到动态库时静态库中的模板化函数会崩溃?

转载 作者:行者123 更新时间:2023-12-02 10:27:45 24 4
gpt4 key购买 nike

在使用XCode 11.6的OSX上,我将v8构建为静态库(libv8_monolith.a)。在一种情况下,我将其链接到一个Executable,一切都很好,在另一种情况下,我将其链接到Bundle(动态库),而模板化函数使EXC_BAD_ACCESS崩溃:
XCode Crash Callstack
例如 AllocatePage():
内存分配器

template <MemoryAllocator::AllocationMode alloc_mode = kRegular, typename SpaceType> EXPORT_TEMPLATE_DECLARE(V8_EXPORT_PRIVATE)
Page* AllocatePage(size_t size, SpaceType* owner, Executability executable);

extern template EXPORT_TEMPLATE_DECLARE(V8_EXPORT_PRIVATE)
Page* MemoryAllocator::AllocatePage<MemoryAllocator::kRegular, PagedSpace>(size_t size, PagedSpace* owner, Executability executable);
内存分配器
template <MemoryAllocator::AllocationMode alloc_mode, typename SpaceType>
Page* MemoryAllocator::AllocatePage(size_t size, SpaceType* owner, Executability executable) {
MemoryChunk* chunk = nullptr;
if (alloc_mode == kPooled) {
DCHECK_EQ(size, static_cast<size_t>(
MemoryChunkLayout::AllocatableMemoryInMemoryChunk(
owner->identity())));
DCHECK_EQ(executable, NOT_EXECUTABLE);
chunk = AllocatePagePooled(owner);
}
if (chunk == nullptr) {
chunk = AllocateChunk(size, size, executable, owner);
}
if (chunk == nullptr) return nullptr;
return owner->InitializePage(chunk);
}

template EXPORT_TEMPLATE_DEFINE(V8_EXPORT_PRIVATE)
Page* MemoryAllocator::AllocatePage<MemoryAllocator::kRegular, PagedSpace>(size_t size, PagedSpace* owner, Executability executable);
如果我改为将其编写为非模板版本,然后重新编译libv8_monolith.a,则不会崩溃:
Page* AllocatePage2(size_t size, PagedSpace* owner, Executability executable);

Page* MemoryAllocator::AllocatePage2(size_t size, PagedSpace* owner, Executability executable) {
MemoryChunk* chunk = nullptr;
if (chunk == nullptr) {
chunk = AllocateChunk(size, size, executable, owner);
}
if (chunk == nullptr) return nullptr;
return owner->InitializePage(chunk);
}
请注意,所有崩溃的模板化函数都没有暴露给外部(它们不是v8.h API的一部分),它们都是v8内部“内部命名空间”的代码。
我缺少一些编译器或链接器标志吗?这甚至是我应该做的事情吗?我是否必须将v8编译为动态库才能在另一个动态库中使用它?

最佳答案

事实证明,After Effects内部有自己的v8动态库,因此,在After Effects加载我们的动态库时,某些功能之间存在名称冲突。我现在的解决方案是使用更改的命名空间重新编译v8,以避免冲突。

关于c++ - 为什么链接到动态库时静态库中的模板化函数会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63562640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com