我必须遗漏一些非常明显的东西,但出于某种原因,Microsoft C++编译器(cl.exe)的命令行版本似乎不支持在运行时报告其版本.我们需要这个来编写makefile,检查我们工具的用户已经安装的编译器版本(他们使用代码获取makefile,他们将在本地编译,因此我们无法控制他们的编译器版本).
在gcc中,你只需要选择-v或--version来打印一个漂亮的版本字符串.
在cl.exe中,-v会出错.
我已经阅读了MSDN文档和编译器在线帮助,我找不到只打印编译器版本的开关.令人讨厌的是,你总是在编译器启动时得到版本......但你似乎无法启动编译器只是为了从中获取版本.
使用qmake查找编译器供应商/版本似乎相似,但只处理gcc的简单情况.
我正在尝试使用VC++ Express 2005,如果这很重要的话.我希望它不会,因为检测编译器版本最好以与编译器版本无关的方式完成:)
回复后更新:
考虑到当今多核和多处理硬件的巨大重要性,试图掌握当前人们实际编写并行代码的方式.对我来说,看起来主流范式是pthreads(POSIX线程),它在Linux上是原生的,可在Windows上使用.HPC人员倾向于使用OpenMP或MPI,但似乎StackOverflow上没有这些.或者你依靠Java线程,Windows线程API等而不是便携式标准?在您看来,建议的并行编程方式是什么?
或者你正在使用更多异国情调的东西,如Erlang,CUDA,RapidMind,CodePlay,Oz,甚至是亲爱的老奥卡姆?
澄清:我正在寻找非常便携的解决方案,适用于各种主机架构上的Linux,各种unix等平台.Windows是一种罕见的案例,非常适合支持.所以C#和.net在这里真的太狭隘,CLR是一个很酷的技术,但是他们可以为Linux主机发布它,这样它就像JVM,Python,Erlang或任何其他可移植语言一样普遍.
基于C++或JVM:可能是C++,因为JVM往往会隐藏性能.
MPI:我同意甚至HPC人员都认为它是一种难以使用的工具 - 但是对于在128000处理器上运行,它是解决map/reduce不适用的问题的唯一可扩展解决方案.但是,消息传递非常优雅,因为它是唯一可以很好地扩展到本地内存/ AMP,共享内存/ SMP,分布式运行时环境的编程风格.
一个有趣的新竞争者是MCAPI.但我认为没有人有时间对此有任何实际经验.
总的来说,情况似乎是有许多我不了解的有趣的微软项目,而且Windows API或pthreads是实践中最常见的实现.
在C++中,局部变量总是在堆栈上分配.堆栈是应用程序可以占用的允许内存的一部分.该内存保存在RAM中(如果没有换成磁盘).现在,C++编译器是否总是创建在堆栈中存储局部变量的汇编程序代码?
举例来说,以下简单代码:
int foo( int n ) {
return ++n;
}
Run Code Online (Sandbox Code Playgroud)
在MIPS汇编程序代码中,这可能如下所示:
foo:
addi $v0, $a0, 1
jr $ra
Run Code Online (Sandbox Code Playgroud)
如您所见,我根本不需要使用堆栈.C++编译器会识别出来,并直接使用CPU的寄存器吗?
编辑:哇,非常感谢您几乎立即和广泛的答案!foo的功能主体当然应该是return ++n;,而不是return n++;.:)
我正在研究从需求/想法的角度为基于Eclipse的编程工具设计新功能.为了真正做到这一点,我想草拟UI元素而不必编写代码 - 我现在关注的是概念和想法,而不是可能的后期实现.Eclipse有没有这样的图形化草图工具?
(另一方面,我还应该注意到,我每天都会发现Eclipse是一个更好的主意,因为你可以将来自很多不同来源的部分系统组合到一个单独的环境中.它确实是IDE的未来,尤其是嵌入式系统的未来系统.它曾经是非常糟糕的Eclipse-3.0之前的版本,但现在看起来确实有效)
我正在努力研究将执行程序的状态存储到磁盘并将其重新引入的基本原则.在我们当前的设计中,每个对象(具有函数指针列表的C级事物,低级自制的面向对象 - 以及这样做的非常好的理由)将是调用将其显式状态导出为可写和可恢复的格式.使这项工作的关键属性是与对象相关的所有状态确实封装在对象数据结构中.
还有其他解决方案,您可以使用活动对象,其中有一些用户级线程附加到某些对象.因此,程序计数器,寄存器内容和堆栈内容突然成为程序状态的一部分.据我所知,没有什么好方法可以在任意时间点将这些东西序列化到磁盘上.线程必须将其自身停放在一些特殊状态,其中程序计数器等没有任何表示,因此基本上将它们的执行状态机状态"保存"到显式对象状态.
我查看了一系列序列化库,据我所知,这是一个通用属性.
核心问题是:或者这实际上不是这样吗?是否存在可以包含线程状态的保存/恢复解决方案,就其代码中的线程执行位置而言?
请注意,在虚拟机中保存整个系统状态不会计算,这不是真正序列化状态,而只是冻结计算机并移动它.这是一个明显的解决方案,但大多数时候都有点重量级.
有些问题清楚表明,我在解释我们如何做事的想法时并不够清楚.我们正在开发一个模拟器系统,允许编写非常严格的内部代码运行规则.特别是,我们在对象构造和对象状态之间进行了完全划分.每次设置系统时都会重新创建接口函数指针,而不是状态的一部分.状态仅由特定的指定"属性"组成,每个属性具有定义的get/set函数,该函数在内部运行时表示和存储表示之间进行转换.对于对象之间的指针,它们都被转换为名称.所以在我们的设计中,一个对象可能会在存储中出现:
Object foo {
value1: 0xff00ff00;
value2: 0x00ffeedd;
next_guy_in_chain: bar;
}
Object bar {
next_guy_in_chain: null;
}
Run Code Online (Sandbox Code Playgroud)
链接列表从未真正存在于模拟结构中,每个对象代表某种硬件单元.
问题是有些人想要这样做,但也有线程作为编码行为的方式.这里的"行为"实际上是模拟单元状态的变异.基本上,我们所设计的设计说,所有这些变化都必须在原子完整的操作中进行,这些操作被调用,完成它们的工作并返回.所有状态都存储在对象中.您有一个被动模型,或者它可以被称为"运行到完成"或"事件驱动".
另一种思考方式是让对象具有活动线程,它们以与传统Unix线程相同的方式处于永久循环中,并且永不终止.这是我试图看看它是否可以合理地存储到磁盘的情况,但是如果没有在下面插入VM,这似乎是不可行的.
更新,2009年10月:与此相关的论文发表在2009年的FDL会议上,参见本文关于检查点和SystemC.
我正在尝试为嵌入式PowerPC板设置驱动程序,今天正确的方法是使用OpenFirmware设备树数据结构(.dtb文件,从.dts文件编译).创建树很容易,但是如何让我的设备驱动程序找到它的节点及其中的数据?我还没有找到任何关于这方面的好参考,像"Linux设备驱动程序"这样的书在x86领域太多,对于主要与基于Power Architecture的机器有关的设备树有很大帮助(Linux内核中的arch powerpc)术语).
我正在尝试对 Django 应用程序使用 GDB 的反向调试。我让它在 GDB 中运行,但我不能让它向后运行。
我使用 Ctrl-Z 停止了 Django 应用程序,然后reverse-next在 gdb 提示符下输入,收到错误消息“目标多线程不支持此命令”。
我做错了吗?这不可能吗?两个都?
因为我讨厌重新发明轮子,我想知道是否有任何常用的打包用来做两个网络端点之间的通信(密钥,值)数据对的简单工作(可能TCP/IP是最可能的载体).我希望在任何环境中都能运行,对我来说,这意味着用C或C++编写的Unix/Linux风格的套接字API.Java很好,但只有Java才能很难集成到二进制程序中.由于需要可移植到Linux主机,C#等已经出局.
有这样的野兽吗?
c++ ×2
assembly ×1
c ×1
device-tree ×1
django ×1
eclipse ×1
gdb ×1
ide ×1
java ×1
linux ×1
makefile ×1
mips ×1
networking ×1
open-source ×1
openmp ×1
powerpc ×1
prototyping ×1
pthreads ×1
python ×1
systemc ×1
visual-c++ ×1