小编Nic*_*son的帖子

静态链接libstdc ++:任何陷阱?

我需要使用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年开始的,从那以后可能发生了很大变化.它的建议仍然是最新的吗?我应该注意哪些潜在的问题?

c++ linux gcc static-libraries libstdc++

81
推荐指数
2
解决办法
5万
查看次数

当Apple说NSManagedObjectContext由创建它的线程或队列拥有时,它意味着什么?

似乎在11月,Apple更新了NSManagedObjectContext类参考核心数据编程指南文档,明确地将串行GCD调度队列和NSOperationQueues作为可接受的机制来同步访问NSManagedObjectContext.但他们的建议似乎含糊不清,可能相互矛盾,我想确保我已经理解它.

以前,公认的智慧似乎NSManagedObjectContext只能从创建它的线程访问,并且使用串行队列进行同步是不够的; 虽然串行队列一次只执行一个操作,但这些操作可能会在不同的线程上进行调度,而MOC不喜欢这样.

但是现在,从编程指南,我们有:

您可以使用线程,串行操作队列或调度队列进行并发.为了简明起见,本文始终使用"线程"来指代其中任何一个.

到目前为止,这么好(尽管他们对线程和队列的混淆是无益的).所以我可以安全地使用每个(串行)队列的单个上下文,而不是每个操作/块一个,对吧?Apple甚至在Core Data WWDC会话中对此进行了直观描述.

但是......你在哪里为队列创建上下文?在NSManagedObjectContext文档中,Apple声明:

[上下文]假定默认所有者是分配它的线程或队列 - 这由调用其init方法的线程确定.因此,您不应该在一个线程上初始化上下文,然后将其传递给另一个线程.

所以现在我们有了一个NSManagedObjectContext需要知道它的主人是谁的想法.我假设这意味着要在队列中执行的第一个操作应该创建MOC并保存对它的引用以供剩余的操作使用.

这是正确的吗?我犹豫不决的唯一原因是NSManagedObjectContext文章继续说:

相反,您应该传递对持久性存储协调器的引用,并让接收线程/队列创建从该派生协调器派生的新上下文.如果使用NSOperation,则必须在main(对于串行队列)或start(对于并发队列)中创建上下文.

Apple现在似乎将操作与安排执行的队列混为一谈.这是我的头脑,并让我想知道他们是否真的希望你只为每个操作创建一个新的MOC.我错过了什么?

cocoa multithreading core-data objective-c

61
推荐指数
2
解决办法
7364
查看次数

如何在GDB中打印STL容器?

我按照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.

c++ linux debugging gdb stl

49
推荐指数
6
解决办法
3万
查看次数

在C++中使用'void'模板参数

采取以下最小例子:

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>,我得到了错误.

c++ templates c++11 std-function

20
推荐指数
3
解决办法
3万
查看次数

为什么ARC保留方法参数?

使用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_retainobjc_release在第二个方法的开始和结束.这是怎么回事?

这不是一个大问题,但是当使用Instruments分析对性能敏感的代码时,会出现这种额外的保留/释放流量.看起来你可以装饰方法参数__unsafe_unretained以避免这种额外的保留/释放,就像我在第三个例子中所做的那样,但这样做感觉非常恶心.

objective-c clang automatic-ref-counting

18
推荐指数
1
解决办法
3867
查看次数

安全地异步使用C++ 11 lambdas

我从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.是否有一些不那么容易出错的方法来实现这一目标?

c++ lambda shared-ptr c++11

16
推荐指数
2
解决办法
4197
查看次数

块捕获对象的过度释放问题; 保持计数从+2直接跳到0!

我对偶然发生的碰撞感到困惑,根据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

8
推荐指数
1
解决办法
1208
查看次数

如何从 Windows 上的静态库或目标文件中删除不需要的符号

是否有适用于 Windows 的 GNU“strip”工具的等效工具?

我想从静态库中删除任何内部符号的名称,以便运行时dumpbin /symbols mylib.lib将不再列出具有内部链接的符号。

在 Linux 上,strip通常使用该命令来执行此操作。您可以按名称删除单个符号,也可以按类型删除单个符号:运行strip --strip-unneeded libmylib.a将从 mylib.a 的目标文件及其内部符号中删除任何 debuginfo 部分。

c++ windows static-libraries visual-c++

7
推荐指数
0
解决办法
3092
查看次数

为Raspberry Pi交叉编译第三方库的非繁琐方式

我正在尝试将现有的Linux C ++应用程序移植到Raspberry Pi。该应用程序依赖于许多第三方库。

我正在运行Ubuntu 12.04,并使用crosstools-ng构建了我的GCC 4.7交叉编译器(直到后来才意识到,使用官方提供的工具链可以省去麻烦!),我可以为我的树莓。到目前为止,一切都很好。

然后,我开始尝试构建所有第三方库依赖项:GLib,SDL和其他几个。这些依赖关系中的每一个都有其自己的依赖关系,等等。很快变得很明显,手动构建所有这些库的ARM版本将非常繁琐且耗时。有没有更简单的方法?

ubuntu cross-compiling raspberry-pi

5
推荐指数
1
解决办法
2142
查看次数

脚本桥和使用NSPredicate和FourCharCodes过滤SBElementArrays

我是第一次尝试使用Scripting Bridge,但是遇到了SBElementArray根据包含FourCharCode枚举常量作为标准的NSPredicate 过滤a的问题.

我写了一个简单的程序来识别用户iTunes库中的"库"源,-filteredArrayUsingPredicate:用于过滤SBElementArray所有iTunes源.我期望得到一个SBElementArray,当评估时,会产生一个元素的数组,即库源.相反,当我调用-get返回时SBElementArray,我得到一个空数组.

令人困惑的,如果更改顺序,而是叫-getSBElementArray的所有来源得到一个具体的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)

cocoa itunes objective-c scripting-bridge

4
推荐指数
1
解决办法
1081
查看次数