如何为 OS X 命令行实用程序构建静态 Realm 库?
How can I build a static Realm library for an OS X command-line utility?
我有一个基于 Foundation 的命令行实用程序,我想为其添加 Realm 支持。我不能使用 Realm.framework,但是,我没有要添加它的捆绑包(而且我更愿意避免涉及 install_name_tool 的安装 hack)。看起来我应该能够构建一个静态库(代替框架)和 link 我的 CLI 实用程序来对抗它。
我尝试在 Realm Xcode 项目中添加一个静态库目标。这个目标几乎与 OS X 框架目标完全相同(相同的源文件,相同的 link 设置,但类型是静态库而不是动态库)。我 link 针对核心 librealm.a 库的静态库,它构建得很好。但是,无论我如何构建这个东西,在尝试 link 我的 CLI 实用程序针对静态库时,我都会遇到 link 错误,例如:
Undefined symbols for architecture x86_64:
"std::runtime_error::what() const", referenced from:
vtable for realm::util::File::PermissionDenied in librealm_static.a(RLMRealm.o)
vtable for realm::util::File::AccessError in librealm_static.a(RLMRealm.o)
vtable for realm::RealmFileException in librealm_static.a(shared_realm.o)
vtable for realm::MismatchedConfigException in librealm_static.a(shared_realm.o)
vtable for realm::UnitializedRealmException in librealm_static.a(shared_realm.o)
vtable for realm::IncorrectThreadException in librealm_static.a(shared_realm.o)
vtable for realm::InvalidTransactionException in librealm_static.a(shared_realm.o)
...
"std::__1::error_code::message() const", referenced from:
realm::SharedGroup::do_open_2(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, realm::SharedGroup::DurabilityLevel, bool, char const*) in librealm_static.a(group_shared.o)
realm::util::mmap(int, unsigned long, realm::util::File::AccessMode, unsigned long, char const*) in librealm_static.a(file_mapper.o)
(anonymous namespace)::mmap_anon(unsigned long) in librealm_static.a(file_mapper.o)
realm::util::munmap(void*, unsigned long) in librealm_static.a(file_mapper.o)
realm::util::mremap(int, unsigned long, void*, unsigned long, realm::util::File::AccessMode, unsigned long) in librealm_static.a(file_mapper.o)
realm::util::msync(void*, unsigned long) in librealm_static.a(file_mapper.o)
realm::util::make_dir(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in librealm_static.a(file.o)
...
[当 link 与 librealm.a(对比 librealm-dbg.a)时编辑以显示未定义的符号]
我也尝试过使用 libtool 生成一个组合静态库,包括核心 librealm.a 库和从开源组件生成的静态库,例如:
cd "$TARGET_BUILD_DIR"
mv librealm_static.a librealm_dev.a
libtool -static -s -arch_only x86_64 -o librealm_static.a librealm_dev.a "$PROJECT_DIR"/core/librealm.a
同样,当我 link 针对新的 "librealm_static.a" 存档时 link 出错——缺少符号。
有没有其他人成功地将 Realm 集成到 OS X 命令行实用程序中?
您列出的特定符号都是仅存在于 librealm-dbg.a 中的调试函数。从预处理器定义中删除 REALM_DEBUG
或使用该库删除 link 而不是 librealm.a.
我有一个基于 Foundation 的命令行实用程序,我想为其添加 Realm 支持。我不能使用 Realm.framework,但是,我没有要添加它的捆绑包(而且我更愿意避免涉及 install_name_tool 的安装 hack)。看起来我应该能够构建一个静态库(代替框架)和 link 我的 CLI 实用程序来对抗它。
我尝试在 Realm Xcode 项目中添加一个静态库目标。这个目标几乎与 OS X 框架目标完全相同(相同的源文件,相同的 link 设置,但类型是静态库而不是动态库)。我 link 针对核心 librealm.a 库的静态库,它构建得很好。但是,无论我如何构建这个东西,在尝试 link 我的 CLI 实用程序针对静态库时,我都会遇到 link 错误,例如:
Undefined symbols for architecture x86_64:
"std::runtime_error::what() const", referenced from:
vtable for realm::util::File::PermissionDenied in librealm_static.a(RLMRealm.o)
vtable for realm::util::File::AccessError in librealm_static.a(RLMRealm.o)
vtable for realm::RealmFileException in librealm_static.a(shared_realm.o)
vtable for realm::MismatchedConfigException in librealm_static.a(shared_realm.o)
vtable for realm::UnitializedRealmException in librealm_static.a(shared_realm.o)
vtable for realm::IncorrectThreadException in librealm_static.a(shared_realm.o)
vtable for realm::InvalidTransactionException in librealm_static.a(shared_realm.o)
...
"std::__1::error_code::message() const", referenced from:
realm::SharedGroup::do_open_2(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, realm::SharedGroup::DurabilityLevel, bool, char const*) in librealm_static.a(group_shared.o)
realm::util::mmap(int, unsigned long, realm::util::File::AccessMode, unsigned long, char const*) in librealm_static.a(file_mapper.o)
(anonymous namespace)::mmap_anon(unsigned long) in librealm_static.a(file_mapper.o)
realm::util::munmap(void*, unsigned long) in librealm_static.a(file_mapper.o)
realm::util::mremap(int, unsigned long, void*, unsigned long, realm::util::File::AccessMode, unsigned long) in librealm_static.a(file_mapper.o)
realm::util::msync(void*, unsigned long) in librealm_static.a(file_mapper.o)
realm::util::make_dir(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in librealm_static.a(file.o)
...
[当 link 与 librealm.a(对比 librealm-dbg.a)时编辑以显示未定义的符号]
我也尝试过使用 libtool 生成一个组合静态库,包括核心 librealm.a 库和从开源组件生成的静态库,例如:
cd "$TARGET_BUILD_DIR"
mv librealm_static.a librealm_dev.a
libtool -static -s -arch_only x86_64 -o librealm_static.a librealm_dev.a "$PROJECT_DIR"/core/librealm.a
同样,当我 link 针对新的 "librealm_static.a" 存档时 link 出错——缺少符号。
有没有其他人成功地将 Realm 集成到 OS X 命令行实用程序中?
您列出的特定符号都是仅存在于 librealm-dbg.a 中的调试函数。从预处理器定义中删除 REALM_DEBUG
或使用该库删除 link 而不是 librealm.a.