小编Kan*_* Li的帖子

如何让gcc使用march = native作为默认值?

有没有办法更改specs文件,以便-march=native在命令行中没有指定任何内容时它将通过?

默认规范文件中的相关内容是:

*cc1:
%(cc1_cpu)

*cc1_cpu:
%{march=native:%>march=native %:local_cpu_detect(arch)   %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}
Run Code Online (Sandbox Code Playgroud)

我不确定规格如何运作.简单地指定-march=native之前或之后%(cc1_cpu)不起作用.不过,此行确实需要的效果,因为如果我把GCC会报告错误-something_wierd,而不是-march=native.

我注意到的另一件事是,如果我%{march=i386:-something_wierd}之前%(cc1_cpu),gcc报告错误,所以看起来-march=i386总是传入,如果没有指定,所以有没有办法区分指定的任何内容和-march=i386specs文件?

顺便说一下,该怎么%>办?好像它没有在文档中指定.

我正在使用MinGW gcc-4.6.2.

gcc gcc4

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

在cmake中,如何以可扩展的方式指定子目录的依赖关系?

假设源树的结构如下:

/
 |- lib1
 |  |- src.cpp
 |  |- lib1.h
 |  |- CMakeLists.txt
 |
 |- lib2
 |  |- src.cpp
 |  |- lib2.h
 |  |- CMakeLists.txt
 |
 |- lib3
 |  |- src.cpp
 |  |- lib3.h
 |  |- CMakeLists.txt
 |
 |- app
 |  |- src.cpp
 |  |- CMakeLists.txt
 |
 |- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

认为:

  1. lib1 有函数 f();
  2. lib2 有函数 g(),它使用 f();
  3. app/src.cpp 使用函数 g();
  4. 没有人使用 lib3。

我想:

  1. 在 app/CMakeLists.txt 中,它仅链接到 lib2。这里的逻辑是,app/src.cpp只使用了g(),所以在编写app/src.cpp时,我们不能指定对lib1的依赖,因为它是lib2的实现细节。所以根据这个逻辑,在app/CMakeLists.txt中,它不能有任何与lib1相关的东西,即它既不是lib1的include_directories,lib1的add_subdirectory,也不是lib1的target_link_libraries等。
  2. 由于没有人使用 lib3,它甚至不会被构建。这需要自动完成。因此,手动为 lib1 和 lib2 添加子目录,但不为 lib3 添加子目录,这并不是一个聪明的方法。您可以想象,如果我们有一个非常大的源代码树,具有复杂的树结构和依赖关系,以及数百个不同子目录中的数百个可执行文件。如果我只想构建其中几个,那么我根本不想构建未使用的库。

所以我的问题是:有没有办法以可扩展的方式编写CMakeLists.txt文件来满足上述要求?如果没有的话,有没有类似的工具可以做到这一点?

谢谢。

c++ build-automation cmake

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

ucontext和线程本地存储

我问的平台是linux。我说的线程本地存储是gcc中的pthread_xxxor 。__thread

我想在我的程序中使用 ucontext 的东西,即 makecontext、swapcontext 等。所以我的问题是,它如何与线程本地存储一起工作?更具体地说,如果我使用 swapcontext 或 setcontext 切换到另一个纤程,线程本地存储是否也会更改,或者线程本地存储不是上下文的一部分?

另一个问题:如果 TLS 将被setcontext/更改swapcontext,那么无论我如何更改上下文,是否有任何东西会粘在线程上?另一方面,如果 TLS 将坚持上下文,那么是否有任何内容将坚持线程并且不会被 setcontext/swapcontext 更改?

根据http://en.wikipedia.org/wiki/Fiber_(computer_science),Windows平台确实有线程本地存储和光纤本地存储。

c++ linux gcc pthreads thread-local-storage

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

模板参数默认为较晚的参数

这个链接没有回答我的问题所以我会在这里问:

基本上我想写一个模板函数

template <typename Out, typename In>
Out f(In x);
Run Code Online (Sandbox Code Playgroud)

在这里,我总是需要Out在调用时指定f.我不想每次都这样做,所以我基本上都想要

template <typename Out = In, typename In>
Out f(In x);
Run Code Online (Sandbox Code Playgroud)

这意味着如果我没有指定Out,它将默认为In.但是,这在C++ 11中是不可能的.

所以我的问题是,有没有办法达到这个效果:

  1. 调用f(t)将实例化f<T,T>(t)或更普遍f<typename SomeThing<T>::type, T>
  2. 调用f<U>(t)将实例化f<U, T>(t)

c++ templates function-templates default-arguments c++11

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

在CentOS上构建整个工具链的教程

我正在使用CentOS 6机器,它有很老的GCC/GlibC版本.我想用最新或至少非常新版本构建整个glibc,binutils,gcc工具链,以便在最新的gcc中使用c ++ 11支持,在最近的binutils中使用ld.gold,并且可能在最近的glibc中进行改进.

我想将整个工具链放在一个单独的目录中,而不是影响任何现有的系统文件.我还想用--sys-root构建gcc,这样在使用gcc时,我不需要指定-I/some/directory/include和-L/some/directory/lib或其他任何参数.生成的可执行文件也将自动使用新的ld-linux-xxxxx程序加载器,它将自动找到新的libc.so.

任何人都知道这个任务是否存在一些教程?

gcc glibc centos binutils centos6

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

在 Java 中以微秒解析时间

我在解析 Java 格式的时间字符串时遇到问题2013-01-09 09:15:03.000000。在我的数据中,最后三位数字始终为 0(意味着输入字符串只有毫秒精度),因此我将此格式传递给 SimpleDateFormat:

formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS'000'");
Run Code Online (Sandbox Code Playgroud)

formatter.parse("2013-01-09 09:15:02.500000");抛出异常:

Unparseable date: "2013-01-09 09:15:02.500000"
    at java.text.DateFormat.parse(DateFormat.java:357)
Run Code Online (Sandbox Code Playgroud)

任何人都知道如何正确地做到这一点?我可以通过使用 formatyyyy-MM-dd HH:mm:ss.SSS和 usingsubstring来摆脱最后三位数字来解决,但这真的很麻烦。

编辑:谁能解释为什么格式字符串yyyy-MM-dd HH:mm:ss.SSS'000'不能用于解析时间"2013-01-09 09:15:02.500000"

java

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

如果使用调试信息编译,则按名称获取全局变量地址

如果我使用gcc编译一些C/C++程序并打开-g和/或-ggdb,那么如果我使用gdb启动程序,我可以在gdb中打印变量值.

我的问题是,没有gdb,我可以从程序内部实现相同的功能吗?在运行时,给定变量的名称(表示为运行时字符串),是否可以读取调试信息,然后获取变量的地址以及类型信息?

谢谢.

c c++ gdb

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

'declare -A x'vs'declare -A x =()'

我使用的是4.2.53(1)-release,由Fedora 20运行.

以下两段代码表现不同,任何人都能说出原因吗?谢谢.

[hidden]$ unset x; declare -p x; function f() { declare -A -g x; x[10]=100; }; f; declare -p x;
-bash: declare: x: not found
declare -A x='([10]="100" )'
[hidden]$ unset x; declare -p x; function f() { declare -A -g x=(); x[10]=100; }; f; declare -p x;
-bash: declare: x: not found
declare -A x='()'
Run Code Online (Sandbox Code Playgroud)

linux bash shell

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

Bash:如何检测管道中的错误

我有这样的命令:

COMMAND1 &&
COMMAND2 | COMMAND3 | COMMAND4 &&
COMMAND5
Run Code Online (Sandbox Code Playgroud)

我想确保所有的COMMAND 1-5都成功.有没有一种简单的方法来实现这一目标?通过研究,我发现PIPESTATUS可以使用,但屈服于一些非常复杂的命令,如

COMMAND1 &&
COMMAND2 | COMMAND3 | COMMAND4 &&
($PST=("${PIPESTATUS[@]}") && (exit ${PST[0]}) && (exit ${PST[1]})) &&
COMMAND5
Run Code Online (Sandbox Code Playgroud)

有办法轻松完成吗?

顺便说一句:我使用(退出n)获取一个命令,该命令除状态n退出外什么都不做.是否有一个UNIX命令直接执行此操作,如true和false?

谢谢.

bash shell

3
推荐指数
1
解决办法
494
查看次数

Ansible全局加密变量

假设我只有一个保险库文件,其中包含一堆我想保密的变量.有没有办法在Ansible中加载文件一次,然后全局访问所有角色和所有任务?

基本上我不喜欢在任何地方复制var_files,如下所示:

- hosts: webserver
  var_files: encrypted.yml
  roles: ....

- hosts: dbserver
  var_files: encrypted.yml
  roles: ....  
Run Code Online (Sandbox Code Playgroud)

ansible ansible-playbook

3
推荐指数
1
解决办法
1186
查看次数