armv7的未定义架构 - 导入C库

时间:2015-01-06 22:33:10

标签: ios xcode openssl static-libraries fips

我正在尝试在我的iOS项目中导入并使用OpenSSL FIPS验证的对象模块。当我构建项目时,我收到此错误说:

Undefined symbols for architecture armv7:
"std::string::clear()", referenced from:
  +[CryptoUtilities getSeed:::] in CryptoUtilities.o
  +[CryptoUtilities getKey:::] in CryptoUtilities.o
"___cxa_pure_virtual", referenced from:
  vtable for WBXML::CWBXMLParser in CWBXMLParser.o
"std::string::substr(unsigned long, unsigned long) const", referenced from:
  WBXML::CWBXMLParser::LoadWBXMLHeader(std::string const&, unsigned long, unsigned long&) in CWBXMLParser.o
  WBXML::CWBXMLParser::LoadTagContents(WBXML::CTag*, std::string const&, unsigned long, unsigned long&, unsigned short&, bool&) in CWBXMLParser.o
  +[CryptoUtilities getKey:::] in CryptoUtilities.o
 "operator delete(void*)", referenced from:
  __gnu_cxx::new_allocator<WBXML::CTag>::deallocate(WBXML::CTag*, unsigned long) in CTag.o
    __gnu_cxx::new_allocator<int>::deallocate(int*, unsigned long) in CryptoUtilities.o

   // This goes for some more functions and then
 ld: symbol(s) not found for architecture armv7
 clang: error: linker command failed with exit code 1 (use -v to see invocation)

我知道here已经提出并回答了这个问题。我尝试了所有提到的解决方案,但我无法解决这个问题。

以下是我尝试解决问题的方法/设置。

  • 我在链接的框架和库部分添加了libs和canister。

  • 由于它是一个lib,我没有要添加的任何.m文件。

  • 我尝试将C ++编译器更改为Compiler Default,LLVM,GNU,但没有一个工作。

  • 我尝试在其他链接器标志中添加-ObjC。

  • 我在包含头文件时尝试了extern C.头文件&#39;定义也正确使用了extern C.

更新:

我确实正确设置了编译器设置,如下所述。

enter image description here

此外,如果这有助于解决此错误。在运行脚本阶段运行此脚本时,我会收到提到的这些错误。

https://docs.google.com/document/d/1YEebn2p8HKhc7lxUWa3xMHXWt1cELXLm3AoKElbEyuU/edit?usp=sharing

请帮帮我。

更新2:

输出xcrun -sdk iphoneos lipo -info CryptoUtilities.o是
    非胖文件:CryptoUtilities.o是架构:armv7

有关错误的更多详细信息: https://docs.google.com/document/d/1CqSa_tAsQP1JY_IxvXLDyYyQUI0iebV_REiCquwDXyk/edit?usp=sharing

请帮忙。我在这个职位上待了大约一个月。

1 个答案:

答案 0 :(得分:0)

"std::string::clear()", referenced from:
  +[CryptoUtilities getSeed:::] in CryptoUtilities.o
  +[CryptoUtilities getKey:::] in CryptoUtilities.o
"___cxa_pure_virtual", referenced from:
  vtable for WBXML::CWBXMLParser in CWBXMLParser.o
"std::string::substr(unsigned long, unsigned long) const", referenced from:
  WBXML::CWBXMLParser::LoadWBXMLHeader(std::string const&, unsigned long, unsigned long&) in CWBXMLParser.o
  WBXML::CWBXMLParser::LoadTagContents(WBXML::CTag*, std::string const&, unsigned long, unsigned long&, unsigned short&, bool&) in CWBXMLParser.o
  +[CryptoUtilities getKey:::] in CryptoUtilities.o
 "operator delete(void*)", referenced from:
  __gnu_cxx::new_allocator<WBXML::CTag>::deallocate(WBXML::CTag*, unsigned long) in CTag.o
    __gnu_cxx::new_allocator<int>::deallocate(int*, unsigned long) in CryptoUtilities.o

这与OpenSSL FIPS对象模块无关。

___cxa_pure_virtual和朋友是C ++运行时的一部分。看起来你正在混合和匹配libc++(由Xcode使用)和libstdc++(由GNU提供)。

由于Xcode,你应该使用libc++作为一切。这意味着您确保所有命令行都有-stdlib=libc++

如果您无法在任何地方使用libc++,那么您需要在任何地方使用libstdc++。 Xcode设置如下所示 C ++标准库

enter image description here

上图是使用libstdc++(GNU库,而不是Xcode默认值)的Crypto ++。虽然它适用于Crypto ++问题,但它也适用于此。