realm - 如何为 OS X 命令行实用程序构建静态 Realm 库?

标签 realm

我有一个基于 Foundation 的命令行实用程序,我想向其中添加 Realm 支持。不过,我无法使用 Realm.framework,因为我没有可以将其添加到的 bundle (而且我更喜欢避免涉及 install_name_tool 的安装黑客)。看来我应该能够构建一个静态库(代替框架)并将我的 CLI 实用程序链接到该库。

我尝试在 Realm Xcode 项目中添加静态库目标。该目标与 OS X 框架目标几乎完全相同(相同的源文件,相同的链接设置,但类型是静态库而不是动态库)。我将静态库链接到核心 librealm.a 库,它构建得很好。但是,无论我如何构建这个东西,当我尝试将 CLI 实用程序链接到静态库时,我都会遇到链接错误,例如:

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)
      ...

[编辑以在链接 librealm.a(相对于 librealm-dbg.a)时显示 undefined symbol ]

我还尝试使用 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

再次,当我链接到新的“librealm_static.a”存档时出现链接错误 - 缺少符号。

还有其他人成功地将 Realm 集成到 OS X 命令行实用程序中吗?

最佳答案

您列出的特定符号都是调试函数,仅存在于 librealm-dbg.a 中。从预处理器定义中删除 REALM_DEBUG 或链接到该库而不是 librealm.a。

关于realm - 如何为 OS X 命令行实用程序构建静态 Realm 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33311405/

相关文章:

json - 如何使用 Realm Swift 和 ObjectMapper 持久化数组?

java - RxJava Multithreading with Realm - 从不正确的线程访问 Realm

android - Jetpack 与 RxJava2 和 Realm 组合

android - OkBuck 和 Realm 的问题

swift - Realm RealmCollectionChange 获取更改的属性

swift - iOS 应用程序在使用 Realm 和 Crashlytics 通过 testflight 启动时卡住

swift - 查询 Realm 列表中的对象

android - realmio - Realm 对象只能从它们创建的线程访问

swift - 如何使用 Realm 更新/删除索引处的对象?

swift - 将 SwiftUI 与自定义发布者结合起来 - 使用 .assign 订阅者时出现意外行为