我需要使用GCC 4.7的libstdc ++将构建在Ubuntu 12.10上的C++应用程序部署到运行Ubuntu 10.04的系统,该系统附带了相当旧版本的libstdc ++.
目前,-static-libstdc++ -static-libgcc
正如本博客文章所建议的那样,我正在编译:静态链接libstdc ++.作者在静态编译libstdc ++时警告不要使用任何动态加载的C++代码,这是我尚未检查的内容.到目前为止,一切似乎都很顺利:我可以在Ubuntu 10.04上使用C++ 11功能,这就是我所追求的.
我注意到这篇文章是从2005年开始的,从那以后可能发生了很大变化.它的建议仍然是最新的吗?我应该注意哪些潜在的问题?
似乎在11月,Apple更新了NSManagedObjectContext类参考和核心数据编程指南文档,明确地将串行GCD调度队列和NSOperationQueues作为可接受的机制来同步访问NSManagedObjectContext
.但他们的建议似乎含糊不清,可能相互矛盾,我想确保我已经理解它.
以前,公认的智慧似乎NSManagedObjectContext
只能从创建它的线程访问,并且使用串行队列进行同步是不够的; 虽然串行队列一次只执行一个操作,但这些操作可能会在不同的线程上进行调度,而MOC不喜欢这样.
但是现在,从编程指南,我们有:
您可以使用线程,串行操作队列或调度队列进行并发.为了简明起见,本文始终使用"线程"来指代其中任何一个.
到目前为止,这么好(尽管他们对线程和队列的混淆是无益的).所以我可以安全地使用每个(串行)队列的单个上下文,而不是每个操作/块一个,对吧?Apple甚至在Core Data WWDC会话中对此进行了直观描述.
但是......你在哪里为队列创建上下文?在NSManagedObjectContext
文档中,Apple声明:
[上下文]假定默认所有者是分配它的线程或队列 - 这由调用其init方法的线程确定.因此,您不应该在一个线程上初始化上下文,然后将其传递给另一个线程.
所以现在我们有了一个NSManagedObjectContext
需要知道它的主人是谁的想法.我假设这意味着要在队列中执行的第一个操作应该创建MOC并保存对它的引用以供剩余的操作使用.
这是正确的吗?我犹豫不决的唯一原因是NSManagedObjectContext
文章继续说:
相反,您应该传递对持久性存储协调器的引用,并让接收线程/队列创建从该派生协调器派生的新上下文.如果使用NSOperation,则必须在main(对于串行队列)或start(对于并发队列)中创建上下文.
Apple现在似乎将操作与安排执行的队列混为一谈.这是我的头脑,并让我想知道他们是否真的希望你只为每个操作创建一个新的MOC.我错过了什么?
我按照GDB维基上的说明安装了用于查看STL容器的python pretty-printers.我~/.gdbinit
现在看起来像这样:
python
import sys
sys.path.insert(0, '/opt/gdb_prettyprint/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end
Run Code Online (Sandbox Code Playgroud)
但是,当我运行GDB并尝试打印STL类型时,我得到以下内容:
print myString
Python Exception <class 'gdb.error'> No type named std::basic_string<char>::_Rep.:
$3 =
Run Code Online (Sandbox Code Playgroud)
任何人都可以对此有所了解吗?我正在运行Ubuntu 12.04,它带有GDB 7.4.
采取以下最小例子:
using Type1 = std::function<void(void)>;
template <typename T>
using Type2 = std::function<void(T)>;
Type1 whyDoesThisWork;
Type2<void> andYetThisDoesNot;
Run Code Online (Sandbox Code Playgroud)
如果第二个类型别名,我得到错误"参数可能没有'void'类型".(我使用Xcode 4.5,Clang/c ++ 11/libc ++,OS X 10.7进行了测试.)
我发现这很奇怪:我本来期望Type1
并且Type2<void>
行为相同.这里发生了什么?有没有办法重写第二类型别名,所以我可以编写Type2<void>
并获取std::function<void(void)>
而不是错误?
编辑我应该补充一点,我想要的原因是允许以下内容:
template <typename ... T>
using Continuation = std::function<void(T...)>;
auto someFunc = []() -> void {
printf("I'm returning void!\n");
};
Continuation<decltype(someFunc())> c;
Run Code Online (Sandbox Code Playgroud)
Continuation<decltype(someFunc())>
成为Continuation<void>
,我得到了错误.
使用ARC进行编译时,方法参数通常似乎保留在方法的开头并在结束时释放.这个保留/释放对似乎是多余的,并且与ARC"产生你本来会编写的代码"的想法相矛盾.在那些黑暗的,ARC之前的日子里没有人对所有方法论证进行额外的保留/释放只是为了安全起见,是吗?
考虑:
@interface Test : NSObject
@end
@implementation Test
- (void)testARC:(NSString *)s
{
[s length]; // no extra retain/release here.
}
- (void)testARC2:(NSString *)s
{
// ARC inserts [s retain]
[s length];
[s length];
// ARC inserts [s release]
}
- (void)testARC3:(__unsafe_unretained NSString *)s
{
// no retain -- we used __unsafe_unretained
[s length];
[s length];
// no release -- we used __unsafe_unretained
}
@end
Run Code Online (Sandbox Code Playgroud)
当在Xcode 4.3.2在释放模式编译的组件(例如,我很能理解它)包含到电话objc_retain
和objc_release
在第二个方法的开始和结束.这是怎么回事?
这不是一个大问题,但是当使用Instruments分析对性能敏感的代码时,会出现这种额外的保留/释放流量.看起来你可以装饰方法参数__unsafe_unretained
以避免这种额外的保留/释放,就像我在第三个例子中所做的那样,但这样做感觉非常恶心.
我从Objective-C背景来到C++ 11,而我正在努力解决的一件事是C++ 11 lambdas与Objective-C"blocks"的不同捕获语义.(见这里进行比较).
在Objective-C中,与C++一样,如果引用成员变量,则会隐式捕获self
/ this
指针.但是因为Objective-C中的所有对象都是有效的"共享指针",所以要使用C++术语,你可以这样做:
doSomethingAsynchronously(^{
someMember_ = 42;
});
Run Code Online (Sandbox Code Playgroud)
...并确保在执行块时,您正在访问其成员的对象将处于活动状态.你不必考虑它.C++中的等价物似乎是这样的:
// I'm assuming here that `this` derives from std::enable_shared_from_this and
// is already owned by some shared_ptr.
auto strongThis = shared_from_this();
doSomethingAsynchronously([strongThis, this] {
someMember_ = 42; // safe, as the lambda holds a reference to this
// via shared_ptr.
});
Run Code Online (Sandbox Code Playgroud)
在这里,您需要记住除了this指针之外还要捕获shared_ptr.是否有一些不那么容易出错的方法来实现这一目标?
我对偶然发生的碰撞感到困惑,根据Zombies乐器的说法,这是由于一些字典值的过度释放造成的.当我查看Instruments中这些过度释放的对象之一的对象历史时,我发现它的保留计数在一个阶段从+2直接下降到0.(看一下帖子末尾的截图).我不清楚这是怎么可能的.
我应该说在使用Instruments进行分析时我只看到这种崩溃,所以我认为它可能是一个Apple漏洞,但是假设它是导航错误可能更安全,而Instruments只是暴露出来.
无论如何,我正在构建一个包含一些Core Foundation对象(CFStrings和CFNumbers)的CFDictionary,然后我将它转换为NSDictionary*并将其传递给Objective-C方法.我的代码的简化版本如下:
// creates a CFDictionary containing some CFStrings and CFNumbers
void doStuff()
{
CFDictionaryRef myDict = CreateMyDictionaryContainingCFTypes();
dispatch_async(myQueue, ^{
[someObject receiveDictionary:(NSDictionary*)myDict];
CFRelease(myDict); // this line causes a crash. The Zombies instrument
// claims a CFString value contained in this
// dictionary has already been freed.
});
}
// ...
- (void)receiveDictionary:(NSDictionary*)dict
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSString* str1 = [dict objectForKey:@"key1"];
NSString* str2 = [dict objectForKey:@"key2"];
NSNumber* num1 = [dict objectForKey:@"key3"];
dispatch_async(myOtherQueue, ^{
[database executeUpdate:@"INSERT INTO …
Run Code Online (Sandbox Code Playgroud) objective-c instruments nszombie grand-central-dispatch retaincount
是否有适用于 Windows 的 GNU“strip”工具的等效工具?
我想从静态库中删除任何内部符号的名称,以便运行时dumpbin /symbols mylib.lib
将不再列出具有内部链接的符号。
在 Linux 上,strip
通常使用该命令来执行此操作。您可以按名称删除单个符号,也可以按类型删除单个符号:运行strip --strip-unneeded libmylib.a
将从 mylib.a 的目标文件及其内部符号中删除任何 debuginfo 部分。
我正在尝试将现有的Linux C ++应用程序移植到Raspberry Pi。该应用程序依赖于许多第三方库。
我正在运行Ubuntu 12.04,并使用crosstools-ng构建了我的GCC 4.7交叉编译器(直到后来才意识到,使用官方提供的工具链可以省去麻烦!),我可以为我的树莓。到目前为止,一切都很好。
然后,我开始尝试构建所有第三方库依赖项:GLib,SDL和其他几个。这些依赖关系中的每一个都有其自己的依赖关系,等等。很快变得很明显,手动构建所有这些库的ARM版本将非常繁琐且耗时。有没有更简单的方法?
我是第一次尝试使用Scripting Bridge,但是遇到了SBElementArray
根据包含FourCharCode枚举常量作为标准的NSPredicate 过滤a的问题.
我写了一个简单的程序来识别用户iTunes库中的"库"源,-filteredArrayUsingPredicate:
用于过滤SBElementArray
所有iTunes源.我期望得到一个SBElementArray
,当评估时,会产生一个元素的数组,即库源.相反,当我调用-get
返回时SBElementArray
,我得到一个空数组.
令人困惑的,如果更改顺序,而是叫-get
上SBElementArray
的所有来源得到一个具体的NSArray
,并呼吁-filteredArrayUsingPredicate:
为在此之前阵列相同的谓词上,我得到了想要的结果.我不相信这应该是必要的,并且我已成功过滤SBElementArray
使用其他NSPredicates(例如@"name=='Library'"
工作正常).
代码片段如下.iTunesESrcLibrary
是由Scripting Bridge生成的头文件中定义的FourCharCode常量.(iTunesESrcLibrary = 'kLib'
).我跑10.6.5.
iTunesApplication* iTunes = [[SBApplication alloc] initWithBundleIdentifier:@"com.apple.iTunes"];
NSPredicate* libraryPredicate = [NSPredicate predicateWithFormat:@"kind == %u", iTunesESrcLibrary];
SBElementArray* allSources_Attempt1 = [iTunes sources];
SBElementArray* allLibrarySources_Attempt1 = (SBElementArray*)[allSources_Attempt1 filteredArrayUsingPredicate:libraryPredicate];
NSLog(@"Attempt 1: %@", allLibrarySources_Attempt1);
NSLog(@"Attempt 1 (evaluated): %@", [allLibrarySources_Attempt1 get]);
NSArray* allSources_Attempt2 = [[iTunes sources] get];
NSArray* allLibrarySources_Attempt2 = …
Run Code Online (Sandbox Code Playgroud) c++ ×5
objective-c ×4
c++11 ×2
cocoa ×2
linux ×2
clang ×1
core-data ×1
debugging ×1
gcc ×1
gdb ×1
instruments ×1
itunes ×1
lambda ×1
libstdc++ ×1
nszombie ×1
raspberry-pi ×1
retaincount ×1
shared-ptr ×1
std-function ×1
stl ×1
templates ×1
ubuntu ×1
visual-c++ ×1
windows ×1