我有一个基于基金会的命令行实用程序,我想向其添加Realm支持。但是,我无法使用Realm.framework,我没有将其添加到其中的捆绑包(而且我更喜欢避免涉及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)链接时进行了编辑,以显示未定义的符号]

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

08-05 15:01