我使用来自Poco源lipo
的组合通用静态 C++ 库创建了一个 iOS 框架libtool
。本质上,我所做的是:
compile Poco for iPhoneOS and iPhoneSimulator
for each architecture:
libtool -static -o libPoco.a libPocoFoundation.a libPocoNet.a libPocoJSON.a
lipo armv6/libPoco.a armv7/libPoco.a i386/libPoco.a -create -output universal/libPoco.a
create a framework from the generated fat library and includes
查看besport/PocoMobile了解更多信息。
现在,我尝试在应用程序中使用这个框架,一切听起来都很好。但是当我尝试使用 Poco 中的类时,链接器会从 Poco 和 libstdc++ 中吐出未定义的符号:
Undefined symbols for architecture i386:
"Poco::format(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Poco::Any const&)", referenced from:
Poco::Logger::warning(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Poco::Any const&) in MapStorage.o
"Poco::Message::Message(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&, Poco::Message::Priority)", referenced from:
Poco::Logger::log(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, Poco::Message::Priority) in MapStorage.o
"std::string::c_str() const", referenced from:
Poco::ProcessImpl::launchByForkExecImpl(std::string const&, std::vector<std::string, std::allocator<std::string> > const&, std::string const&, Poco::Pipe*, Poco::Pipe*, Poco::Pipe*, std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > const&) in Poco(Process.o)
Poco::EnvironmentImpl::setImpl(std::string const&, std::string const&) in Poco(Environment.o)
Poco::EnvironmentImpl::hasImpl(std::string const&) in Poco(Environment.o)
Poco::EnvironmentImpl::getImpl(std::string const&) in Poco(Environment.o)
"std::string::empty() const", referenced from:
...
我用nm
and进行了验证libtool -info
,库文件似乎包含正确的功能。如果我不对 Poco 做任何事情,我在项目中拥有的 Objective-C++ 文件也可以正常编译。
- 这是否必须将库作为 C++ 库?我必须打开任何编译器标志吗?
- 真的可以
libtool -static
使用 .a 库吗?我这样做对吗?