我已经能够使用MinGW GCC 3.4.5构建LLVM 2.6(llvm-2.6.tar.gz包).我没有正确测试,但它似乎工作.
问题是,我有自己的库,不使用GCC3构建,但在GCC4(模板问题)中工作正常.我相信MinGW的第一个官方GCC4版本是GCC 4.4.0.
编辑
整洁 - 一切有用的"尝试过这个尝试过"的信息现在都在答案中.
编辑
这个问题/答案大部分都是LLVM 2.7的冗余 - 标准配置,make例程在MinGW中工作正常,没有任何黑客或变通方法.
(有向)图表代表有限自动机.到目前为止,我的测试程序已经写出了用于测试的点文件.这对于回归测试(将验证的输出文件保存在subversion中,询问是否存在更改)和可视化都非常好.但是,有一些问题......
基本上,我想要一些可以从C++中调用的东西,它可以为我的状态和过渡计划一个布局,但是将绘图留给我 - 这将允许我绘制我想要的东西并在GUI(wxWidgets)窗口上绘制.
我还想要一个允许商业用途的许可证 - 我目前不需要它,我可能很好地作为开源发布,但我不想限制我的选择ATM.
GraphViz的问题是(1)关于在Windows上从源构建的警告,(2)用于呈现和解析的所有不必要的依赖性,以及(3)(假定的)缺少具体且纯粹用于布局的文档API.
基本上,我希望能够指定我的状态(具有边界矩形大小)和过渡,并读出每个过渡的状态和航点的位置,然后基于这些坐标自己绘制.我还没有弄清楚应该如何处理转换上的注释,但应该有一些规定来为那些指定边界框大小,将它们与转换相关联,以及读出位置.
有谁知道可以处理这些要求的库?
我不一定反对为自己实施某些东西,但在这种情况下,如果可能的话,我宁愿避免它.
情况是我花了一些时间搞乱一些实验性代码.我现在想将部分代码 - 大约500行 - 移动到另一个文件中,但我不想丢失历史记录,就像我做一个简单的文本编辑器剪切和粘贴一样.
尽管我知道如何获得将原始文件 - svn副本中的代码分开,然后从两个副本中删除不需要的东西.但我不知道如何将部分副本附加到现有文件上,保留两者的历史记录.
这很重要的原因基本上是代码只是非常专业的东西,以帮助实现一些更高级别的功能.我不希望它污染全局命名空间,所以我希望它在一个文件中,它将被使用并包装在匿名命名空间中.
我意识到这听起来像将一个分支合并回主干.问题是,没有分支.实验代码并不是作为任何东西的副本开始的 - 它只是一堆从头开始的代码.我要剪切的文件和我要粘贴的文件是完全独立的文件.
我主要使用TortoiseSVN,但也安装了命令行subversion.
理论上,使用cmake使用资源文件构建Win32应用程序非常容易.在add_executable命令中,资源文件可以像C或C++源文件一样容易地列出.但是,使用MinGW工具构建时存在一个已知错误.
我找到了一个解决方法,即在CMakeFiles.txt中包含以下内容......
if(MINGW)
set(CMAKE_RC_COMPILER_INIT windres)
ENABLE_LANGUAGE(RC)
SET(CMAKE_RC_COMPILE_OBJECT
"<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>")
endif(MINGW)
Run Code Online (Sandbox Code Playgroud)
不幸的是,这似乎不起作用.似乎发生的是windres生成一个不理解的<whatever>.rc.res文件ld.
在我的搜索中,我强烈怀疑Win32支持被视为非常低的优先级,尤其是在Visual Studio之外.这是可以理解的,因为Win32显然不像以前那么重要.当然,Visual Studio Express Editions可以免费轻松获得.
即便如此,如果我可以将MinGW GCC用于我仍在使用的一些旧版Win32应用程序,对我来说会很方便.如果不出意外,我可以获得GCOV测试覆盖率统计数据.
显然,如果所有其他方法都失败了,我总是可以使用自定义构建命令处理资源文件.一个问题是我不熟悉windres或ld,或者MinGW是如何处理Win32资源文件的.另一个是,如果有人已经拥有了一个他们想与我分享的优质轮子,我真的不想重新发明轮子.
基本上就是这样 - 我如何使用cmake支持使用资源文件构建Win32应用程序,并使用MinGW(但不破坏对Visual Studio的支持)?
一年多以前,我问过如何在Haskell中使用代理问题,从那时起我就少量使用了RankNTypes GHC扩展.麻烦是每次我尝试使用它时,我最终都会收到奇怪的错误消息,并且会破解代码直到它们消失为止.否则我放弃了.
显然我并不真正理解Haskell中更高级别的多态性.为了解决这个问题,我决定直接找到我能做的最简单的例子,测试我所有的假设,看看我是否可以让自己成为尤里卡时刻.
第一个假设 - 更高级别的多态性不是标准Haskell 98(或2010?)功能的原因是,如果您接受许多程序员甚至不会注意到的一些不那么明显的限制,则不需要.我可以定义等级1和等级2的多态函数,这些函数初看起来是等价的.如果我将它们加载到GHCi并使用相同的参数调用它们,它们将给出相同的结果.
所以 - 简单的示例函数......
{-# LANGUAGE RankNTypes #-}
rank0 :: [Int] -> Bool
rank0 x = null x
rank1a :: [a] -> Bool
rank1a x = null x
rank1b :: forall a. [a] -> Bool
rank1b x = null x
rank2 :: (forall a. [a]) -> Bool
rank2 x = null x
Run Code Online (Sandbox Code Playgroud)
和GHCi会议......
GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking …Run Code Online (Sandbox Code Playgroud) 我正在使用mingw gcc 4.4.0试验gcov.我一直在得到一些有趣但奇怪的结果.一个常见的模式是这样的......
5162: 66: std::string::iterator i = l_Temp.begin ();
5162: 67: std::string::iterator j = l_Temp.end () - 1;
-: 68: char ch;
-: 69:
20564: 70: while (i < j)
-: 71: {
10240: 72: ch = *i; *i = *j; *j = ch; i++; j--;
-: 73: }
-: 74:
#####: 75: return l_Temp;
-: 76:}
Run Code Online (Sandbox Code Playgroud)
return考虑到之前的循环是否正在执行和退出,怎么可能根本不被执行?鉴于此临时变量属于类型,我认为我是这里返回值优化的受害者std::string.
麻烦的是,我已经-O0在编译器选项中指定了.这些是我正在使用的确切编译器标志...
-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage
Run Code Online (Sandbox Code Playgroud)
我最好的猜测是,毕竟不是所有的优化都被禁用了-O0.当我发现问题时,我可以逐一寻找特定的优化标记,但这似乎是一件奇怪的事情.
那么-标志应该我是指定,以获得从gcov的理智的覆盖效果?
编辑
到目前为止,我认为我需要以下额外标志......
编辑公共健康警告 - 此问题包含有关未定义行为的错误假设.见接受的答案.
在阅读了最近的博客文章后,我一直在思考避免C和C++代码中所有标准未定义假设的实用性.这是一个用C++剪切的片段,用于做无符号的128位加法......
void c_UInt64_Pair::operator+= (const c_UInt64_Pair &p)
{
m_Low += p.m_Low;
m_High += p.m_High;
if (m_Low < p.m_Low) m_High++;
}
Run Code Online (Sandbox Code Playgroud)
这显然依赖于关于溢出行为的假设.显然,大多数机器都可以支持正确类型的二进制整数(尽管可能是从32位块或其他任何东西构建的),但优化者可能会在这里利用标准未定义的行为.也就是说,m_Low < p.m_Low条件可以通过的唯一方法是m_Low += p.m_Low溢出,这是未定义的行为,因此优化器可以合法地确定条件总是失败.在这种情况下,这个代码就被打破了.
问题是,因此......
如何在不依赖未定义行为的情况下编写上述合理有效的版本?
假设您有一个适当的64位二进制机器整数,但您有一个恶意编译器,它将始终以最坏的(或不可能的)方式解释您的未定义行为.此外,假设您没有一些特殊的内置,内在,库或其他任何为您执行此操作的内容.
EDIT 略微澄清 - 这不仅仅是关于检测溢出,而且还确保m_Low和m_High都以正确的模2 ^ 64结果结束,这也是标准未定义的.
我对C++感兴趣,但我怀疑只是导入C标准定义.我相信标准所说的答案是肯定的,但我对实践中的答案最感兴趣.
如果RAND_MAX总是(2 ^ n)-1,那么这简化了处理最近将代码从MinGW GCC移动到Linux GCC的问题.RAND_MAX似乎更大(我没有检查,但可能等于INT_MAX或符号是什么),所以一些旧的天真写的RAND_MAX - 不够大 - 所以 - 解决它的代码适得其反.现在我需要确定我需要这个库的一般性,考虑到编写正确处理溢出可能性的代码的繁琐,而不用假设例如int的宽度.
无论如何,是否有任何合理广泛使用的C++编译器使用除(2 ^ n)-1以外的东西用于RAND_MAX?
另外,我是否正确((RAND_MAX |(RAND_MAX >> 1))== RAND_MAX)总是并且仅当RAND_MAX等于((2 ^ n)-1)某些无符号整数n时才为真.我认为RAND_MAX在技术上是一个int,但是没有任何意义的是有一个负值或小数值,所以我认为我可以安全地折扣那些.比特摆弄通常不会打扰我,但我一直认为表情看起来不对,我无法弄清楚原因.
最后,虽然在我有自己的解决方案之前我不会高兴,但我应该使用随机数而不是自己编写?我需要0 <= x <参数范围内的随机数,我特别希望所有数字的概率相等.例如,取(rand()%upperbound)会偏向较小的值,特别是当上限很大时 - 我想避免这种情况.
是否有Boost或C++ 0x的东西?
编辑
在页面侧面的"相关"位中显示的内容显示确实有一种方法可以获得具有给定下限和上限的随机数.
有些项目为C(以及可能的C++ - 不确定)库提供了一组"Windows"二进制文件.例如,请参阅此libxml相关页面右侧的链接.
我很确定没有办法在VC++ .lib文件和MinGW GCC .a文件之间进行转换,所以称它们为"Windows"而不是"Microsoft"二进制文件似乎有点误导.但我也很惊讶,不同的VC++版本不需要不同的二进制文件.
很多年前,我似乎记得在为跟踪器风格的音乐程序(Jeskola Buzz)编写插件时遇到问题,因为该程序使用的是VC++ 6,而且我已升级到VC++ 7.我不记得确切的问题 - 它可能部分与DLL有关,但我知道那些不需要关心VC++版本.我认为这个问题与提供的.lib文件有关,也可能与它们链接到的运行时库有关.不久之前,所以它有点含糊不清.
无论如何,可以通过MS VC的一个版本编译库++链接到另一个版本构建项目?有什么限制,如果有的话?
我对C和C++库感兴趣,这些库将从C++项目调用(我很少使用C,除了从C++调用的C库).
在考虑奇怪问题的"创造性"(即奇异)解决方案时,一个特定的想法引发了我的好奇心.这不是我可能会使用的想法,但我仍然想知道它是否符合标准是合法的.
一个简单的例子就是......
class base_t
{
private:
// stuff
public:
// more stuff
class derived_t : public base_t // <--- weirdness here
{
// ...
};
};
Run Code Online (Sandbox Code Playgroud)
奇怪的一部分 - 从derived_t继承base_t包含derived_t,它似乎derived_t包含自己.
那么 - 这是一个有效但奇怪且可怕的事情,类似于奇怪的反复出现的模板模式,还是非法的?
编辑 - 我或许应该提到我之所以想到这个原因是为了避免一些命名空间污染.将类作为成员避免引入另一个全局类,但第二个类需要从第一个类共享很多.
如果它只是一对类,那就不是问题,但这是代码生成器.