我有一些问题试图使用c 0x线程功能静态链接程序.代码看起来这样((Compiler是 gcc 4.6.1在Debian x86_64测试)
#include <iostream>
#include <thread>

static void foo() {
  std::cout << "FOO BAR\n";
}

int main() {
  std::thread t(foo);
  t.join();
  return 0;
}

我链接到:

g++ -static -pthread -o t-static t.cpp -std=c++0x

当我执行程序时,我有以下错误:

terminate called after throwing an instance of 'std::system_error'
  what(): Operation not permitted
Aborted

GDB调试输出如下所示:

Debugger finished
Current directory is ~/testspace/thread/
GNU gdb (GDB) 7.2-debian
copyright (C) 2010 Free Software Foundation,Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY,to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions,please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/will/testspace/thread/t-static...done.
(gdb) list -
1   #include <iostream>
(gdb) b 1
Breakpoint 1 at 0x4007c8: file t.cpp,line 1.
(gdb) r
Starting program: /home/will/testspace/thread/t-static 
terminate called after throwing an instance of 'std::system_error'
  what():  Operation not permitted

Program received signal SIGABRT,Aborted.
0x00000000004a8e65 in raise ()
(gdb) bt
#0  0x00000000004a8e65 in raise ()
#1  0x000000000045df90 in abort ()
#2  0x000000000044570d in __gnu_cxx::__verbose_terminate_handler() ()
#3  0x0000000000442fb6 in __cxxabiv1::__terminate(void (*)()) ()
#4  0x0000000000442fe3 in std::terminate() ()
#5  0x0000000000443cbe in __cxa_throw ()
#6  0x0000000000401fe4 in std::__throw_system_error(int) ()
#7  0x00000000004057e7 in std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) ()
#8  0x0000000000400b18 in std::thread::thread<void (&)()> (this=0x7fffffffe540,__f=@0x4007c4) at /usr/include/c++/4.6/thread:135
#9  0x00000000004007f3 in main () at t.cpp:11
(gdb)

更新:

与静态libstdc链接可能(可能)使此错误消失,并且编译的C 0x程序可以在没有gcc 4.6 libs的系统上运行:

g++ -static-libgcc -pthread -L.-o t thread.cpp -std=c++0x

但是,首先,我们应该在当前目录下创建一个符号链接到“libstdc .a”:

ln -s `g++ -print-file-name=libstdc++.a`

(参考:http://www.trilithium.com/johan/2005/06/static-libstdc/)

解决方法

因为我完全不知道的原因(我认为这是一个错误),因为函数__ghtread_active_p()将被内联返回false(看看_M_start_thread的装配体),所以不能在gcc 4.6上使用std :: thread,导致这个异常被抛出.它可能是需要pthread_create函数的弱符号,当静态链接它们不在那里时,但是为什么他们不这样做是超出我的(注意,程序集以后包含像callq 0x0这样的东西,似乎有去某事非常错误).

现在我个人使用boost :: threads,因为我正在使用boost …

C 0x线程静态连接问题的更多相关文章

  1. 更改Xcode中的工作目录

    我设法使用cmake-GXcode在Xcode中运行C项目.现在我想调试它,因为它提供了很好的gdb.但是,我需要更改gdb执行的工作目录,否则它将无法工作.我可以做的是在gdb停止键入cdworking_dir之后,然后手动输入r.这是有效的,但Xcode将不断投诉,也不是一个优雅的解决方案.所以在构建设置的某个地方我应该能够设置工作目录.但在哪里?解决方法在Xcode中,在可执行文件上执行“获取信息”,并查看第一个选项卡–有一个工作目录的设置.

  2. xcode – Swift Constants文件 – 类还是结构?

    我想在我的Swift项目中创建一个Constants文件–填充静态let字符串.我应该创建一个结构还是一个类?

  3. Swift中的static func和class func有什么区别?

    我可以在Swift库中看到这些定义:定义为staticfunc的成员函数和定义为func类的另一个函数之间有什么区别?是简单的静态是结构和枚举的静态函数,类和协议的类?有什么其他差别,应该知道吗?在语法本身中有这种区别的理由是什么?一些其他的区别是类函数是动态分派的,可以被子类覆盖。为协议选择了类,因此不必有第三个关键字来表示静态或类。

  4. Swift静态和动态分发机制

    这同样表示编译器内联函数。举个例子,不是调用函数而是将其替换为函数本身的代码。他同样可以丢弃和简化编译时被证明实际不运行的代码。Methodsonclassesorprotocolsmightbedynamicallydispatched.Thismeansthecompilerdoesn’tnecessarilykNowatcompiletimewhichfunctionwillrun.Thisdynamicbehaviorisdoneeitherbyusingvtables,orinthecaseof

  5. 如何在swift中的类中定义静态常量

    我有这些定义在我的函数中的工作但是如果我将’testStr’和’testStrLen’移动到类级别,它将不会编译。它说’MyClass.Type没有名为’testStr’的成员。我不想每次都要为不断的“测试”计数。基于我对下面评论的理解,我需要这样做:有没有办法我不需要键入/输入“测试”两次?也许一个很好的习惯用于在Swift中声明类的常量是使用一个名为MyClassConstants的结构,如下所示。请参见“Swift编程语言”中的ArrayLiterals。但是,由于数组类型是已知的,整数常量test

  6. Swift中的静态函数变量

    我试图找出如何声明一个静态变量只有本地的一个函数在Swift中。在C中,这可能看起来像这样:在Objective-C中,它基本上是一样的:但我似乎不能在Swift中做这样的事情。我已经尝试声明变量在以下方式:但这些都导致错误。>第一个抱怨“静态属性只能在类型上声明”。尝试声明一个带有静态变量的私有结构体。

  7. Swift是动态还是静态语言?

    我只是好奇,如果Swift是动态的像PHP或静态,我的意思是我可以在应用程序运行时生成类?

  8. swift – public static vs open static vs public class vs open class?

    随着Swift3中open关键字的引入,以下是一个方法的有效范围修饰符:openstatic,publicstatic,openclass,publicclass,但它们的区别究竟是什么?我知道public应该相当于Java中的publicfinal,允许重写开放类方法和变量,但是公共类func或openstaticfunc是什么意思?它们是公共静态函数的同义词吗?即所有3个实现都不允许子类覆盖?在特定情况下,4种不同排列中的每一种都有独特的优势吗?

  9. GBD:如何查看存储在内存中的一系列值

    作为我正在学习的一个大型项目的一部分,我需要破译大量的程序集。要判断这一点,我需要通过调试代码找到“炸弹”不同“阶段”的答案。目标是不引爆炸弹。看完之后,我决定需要查看read_six_numbers中的内容,如下所示:这导致我想知道0x3409中的内容,如下所示。所以我想我的答案应该是存储在不同%d中的六个数字。然而,当我在gdb中键入print0x3409时,我得到了13321,这是0x3409的十进制数,而不是实际存储在内存中的值。

  10. 哪个单元测试框架用于Windows上的C开发?

    在WindowsXP上,使用TDM’sGCC/MinGW32进行基本开发,即使用gdb的gcc4.4.x.哪个单元测试框架用于测试驱动开发?

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部