gpt4 book ai didi

ios - 在 ios 上使用来自框架的 boost::filesysystem 路径

转载 作者:可可西里 更新时间:2023-11-01 03:30:52 26 4
gpt4 key购买 nike

一段时间以来,我一直在使用 Boost 作为根据 Pete Goodliffe 的脚本构建的框架。效果很好。最近我遇到了一个问题,可以通过将以下代码放到一个全新的 XCode 项目中的 View Controller 的 viewDidLoad 中来重现:

#include "boost/filesystem/path.hpp"
#include "boost/filesystem/operations.hpp"


- (void)viewDidLoad
{
[super viewDidLoad];
boost::filesystem::path path("/var/mobile/Applications/.../Documents/somefile.txt");
bool b = boost::filesystem::exists(path);
}

当路径对象被销毁时,这会导致 EXC_BAD_ACCESS(问题出现在路径的 basic_string 成员的析构函数中)。还有其他人遇到过这个问题吗?一切都是用相同的 SDK 构建的,并且在测试项目和框架上的可见性设置是相同的。在::exists 中,唯一调用路径的函数是 .c_str(),我可以毫无问题地在我的代码中调用它。它将.c_str()的结果传递给::stat,我也可以调用成功。这似乎是某种运行时不匹配。有什么想法吗?

最佳答案

Pete Goodliffe 的脚本使用 gcc 构建 boost,在当前的 SDK 中是 llvm-gcc。 Boost.Build 系统检测 gcc 并为某些事情启用一组可见性宏,特别是在使用 GCC 时文件系统库使用的一些异常宏。默认情况下,使用当前 SDK 构建的 iOS 应用程序将使用 clang。 boost 配置 header 在使用时也会检测到 clang,并且这些可见性宏的配置方式不同。当您使用 clang 构建针对 boost 的应用程序但使用由 gcc 构建的 boost 库时,这会导致一些链接器警告,例如关于所讨论的异常类的 vtable 和析构函数可见性。当您的字符串被传递到这些类之一时,就像您调用 filesystem::exists() 时可能发生的那样,您会在析构函数中看到崩溃。

对于这个特定的示例,您可以通过使用 visibility=default 构建 boost 来解决问题,但这不太可能适用于非平凡的应用程序。到目前为止,看起来最好的办法是将编译器设置为 clang++,这样您在构建库时就可以像在构建应用程序时那样对这些类设置有效的可见性。这是我目前正在使用的 user-config.jam(我的修改版本)该脚本和 Xcode 4.2.x。请注意,如果您没有在脚本中进行设置,则需要替换 $IPHONE_SDKVERSION、ARM_DEV_DIR 和 SIM_DEV_DIR。对我来说,它们分别是 5.0 和 iphone 和模拟器 SDK 的 bin 目录:

using darwin : $IPHONE_SDKVERSION~iphone
: ${ARM_DEV_DIR}clang++
: <striper>
<compileflags>"-arch armv7 -fvisibility=hidden -fvisibility-inlines-hidden $EXTRA_CPPFLAGS"
: <architecture>arm <target-os>iphone
;
using darwin : $IPHONE_SDKVERSION~iphonesim
: ${SIM_DEV_DIR}clang++
: <striper>
<compileflags>"-arch i386 -fvisibility=hidden -fvisibility-inlines-hidden $EXTRA_CPPFLAGS"
: <architecture>x86 <target-os>iphone
;

到目前为止,这似乎运作良好;我没有进行足够的测试以完全确保自己没有与 clang 相关的 boost 问题,但这看起来比将新的 iPhone 项目带回 llvm-gcc 更容易。

关于ios - 在 ios 上使用来自框架的 boost::filesysystem 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9100723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com