【问题标题】:Two modules with the same library dependency fail to compile具有相同库依赖的两个模块无法编译
【发布时间】:2019-05-02 21:25:42
【问题描述】:

我正在开发一个 CocoaPod,它依赖于我也编写的另外两个 pod。假设 Pod1、Pod2 和 Pod3。 Pod2 和 Pod3 在他们的 podspecs 中有这个:

...
s.libraries 'sqlite3'
...

...这是因为它们都使用依赖于 sqlite 的不同静态库。该行在各自的 cocoapod 编译中将 sqlite3 添加为链接库(构建阶段上的“链接框架和库”)。 然后,Pod1 将这两个 pod 作为依赖项:

...
s.dependency 'Pod2'
s.dependency 'Pod3'
...

当我尝试编译 Pod1 时,抛出此错误:

Undefined symbols for architecture x86_64:
  "_sqlite3_open", referenced from:
      DatabaseConnection::open() in libSecurIDLib.a(databaseconnection.o)
  "_sqlite3_bind_int", referenced from:
      AbstractStatement::bindValue(sqlite3_stmt*, DataValue const&, int) in libSecurIDLib.a(abstractstatement.o)
  "_sqlite3_bind_double", referenced from:
      AbstractStatement::bindValue(sqlite3_stmt*, DataValue const&, int) in libSecurIDLib.a(abstractstatement.o)
  "_sqlite3_bind_text", referenced from:
      AbstractStatement::bindValue(sqlite3_stmt*, DataValue const&, int) in libSecurIDLib.a(abstractstatement.o)
  "_sqlite3_bind_blob", referenced from:
      AbstractStatement::bindValue(sqlite3_stmt*, DataValue const&, int) in libSecurIDLib.a(abstractstatement.o)
  "_sqlite3_column_double", referenced from:
      AbstractStatement::parseRow(sqlite3_stmt*) in libSecurIDLib.a(abstractstatement.o)
  "_sqlite3_bind_null", referenced from:
      AbstractStatement::bindValue(sqlite3_stmt*, DataValue const&, int) in libSecurIDLib.a(abstractstatement.o)
  "_sqlite3_column_bytes", referenced from:
      AbstractStatement::parseRow(sqlite3_stmt*) in libSecurIDLib.a(abstractstatement.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::reserve(unsigned long)", referenced from:
      KeyValueMapper::extractValue(boost::shared_ptr<KeyValuePair>) in libSecurIDLib.a(keyvaluemapper.o)
  "_sqlite3_exec", referenced from:
      CreateTableStatement::execute(DatabaseConnection*) in libSecurIDLib.a(createtablestatement.o)
      EndTransactionStatement::execute(DatabaseConnection*) in libSecurIDLib.a(endtransactionstatement.o)
      BeginTransactionStatement::execute(DatabaseConnection*) in libSecurIDLib.a(begintransactionstatement.o)
  "_sqlite3_finalize", referenced from:
      AbstractStatement::takeStepsAndFinalize(sqlite3_stmt*) in libSecurIDLib.a(abstractstatement.o)
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::append(char const*)", referenced from:
      TokenMapper::convertDate(CK_DATE const&) in libSecurIDLib.a(tokenmapper.o)
      SqlStrings::generateInsertStatement(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int) in libSecurIDLib.a(sqlstrings.o)
      SqlStrings::generateCreateTableStatement(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, boost::shared_ptr<std::__1::vector<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, DataValue::SQL_DATATYPE>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, DataValue::SQL_DATATYPE> > > >) in libSecurIDLib.a(sqlstrings.o)
      SqlStrings::generateDeleteStatement(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libSecurIDLib.a(sqlstrings.o)
      SqlStrings::generateSelectStatement(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in libSecurIDLib.a(sqlstrings.o)
      SqlStrings::generateUpdateStatement(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, boost::shared_ptr<std::__1::vector<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, DataValue>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, DataValue> > > >) in libSecurIDLib.a(sqlstrings.o)
  "vtable for __cxxabiv1::__vmi_class_type_info", referenced from:
      typeinfo for RSA::Crypto::BSAFE_Recode in libSecurIDLib.a(BSAFE_Recode.o)
      typeinfo for RSA::Crypto::BSAFE_SecretKey in libSecurIDLib.a(BSAFE_CryptoKey.o)
      typeinfo for RSA::Crypto::BSAFE_PublicKey in libSecurIDLib.a(BSAFE_CryptoKey.o)
      typeinfo for RSA::Crypto::BSAFE_PrivateKey in libSecurIDLib.a(BSAFE_CryptoKey.o)
      typeinfo for RSA::Crypto::BSAFE_CryptoHash in libSecurIDLib.a(BSAFE_CryptoHash.o)
      typeinfo for RSA::Crypto::BSAFE_SymmetricCipher in libSecurIDLib.a(BSAFE_SymmetricCipher.o)

由于字数限制,还有一些不适合此处的错误,然后以:

      ...
  "_xmlSchemaCleanupTypes", referenced from:
      -[yqKtL17 validateTdpUsingXsd:] in libSecurIDLib.a(TdpProcessor.o)
  "___cxa_guard_release", referenced from:
      SecLibMesState::instance() in libSecurIDLib.a(SecLibMesState.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我有哪些选择?我尝试在一个单独的共享 pod 中 publish sqlite3,但两个库都没有接受它

【问题讨论】:

    标签: xcode cocoapods xcodebuild


    【解决方案1】:

    确保 podspec 将 sqlite3 指定为系统库依赖项:

    s.library = 'sqlite3'

    【讨论】:

    • 两个 pod 都有这条线。这就是他们导入 sqlite 的方式
    • “当两个 pod 放在主 pod 上时”是什么意思?将 sqlite 添加到应用程序的 Link Binary With Libraries Build Phase 是一种解决方法吗?
    • 编辑了问题,希望它更清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2015-12-16
    • 2020-07-23
    相关资源
    最近更新 更多