Articles of 可移植性

简单的C代码可以在HPUX上正常工作,但是Linux上的段错误。 为什么?

我很长时间没有做过任何严肃的C,希望能够快速解释一下。 以下代码在HP / UX上编译并运行良好。 它在GCC 4.3.2上编译没有任何警告(甚至是在gcc-Wall中),但在Linux上运行时却是segfaults。 谁能解释为什么? #include <stdio.h> int main() { char *people[] = { "Abigail", "Bob" }; printf("First: '%s'\n", people[0]); printf("Second: '%s'\n", people[1]); /* this segfaults on Linux but works OK on HP/UX */ people[1][0] = 'R'; printf("First: '%s'\n",people[0]); return(0); }

docker图像可移植到不同的linux风格?

docker图像可移植到不同的linux风格? 比方说,如果我安装了基于OEL的Docker镜像,可以在Mac上的boot2docker中运行这个镜像吗?

汇编程序是否可以在Linux发行版之间移植?

在Linux发行版之间是否可以使用汇编程序格式提供的程序(模CPU架构差异)? 这里是我的问题的背景:我正在研究一种新的编程语言(命名为Aklo),其操作方式将是经典编译为.s并将结果提供给GNU汇编程序。 很明显,最终将自己的实现编写好,但我已经辞去了维护它在C + +解决egg和egg问题:假设你第一次下载编译器,它本身写在Aklo,如何你编译它? 据我了解,不同的Linux发行版和其他类似UNIX的系统对二进制格式有不同的约定。 但是我发现,一个解决scheme可能是发送.s文件(每个CPU架构一个):假设你已经安装了GNU汇编程序,或者可以安装GNU汇编程序。 当然,我仍然需要一个引导编译器,但是这并不需要很快; 我可以用Python编写它。 汇编程序是否可移植的方式,二进制文件不是? 还有没有其他的绊脚石我没有想到? 添加回应一个答案: 我曾经看过LLVM,肯定有很多好东西,这会让我的生活变得更轻松,只不过它会导致对安装的正确版本的LLVM的依赖。 依赖开发机器并不会那么糟糕,但是在一个通常将程序作为源代码运行的世界中,对于每一个在Aklo编写的程序的每个用户都会产生同样的依赖性,我也决定这样做高昂的代价付款。 但是,如果将编译好的程序作为汇编程序运行,那么解决这个问题,我可以使用LLVM,这将是一个巨大的胜利。 所以关于汇编程序可移植性的问题甚至比我最初意识到的要重要得多。 结论:从这里和LLVM邮件列表http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-January/028991.html上的答案看来,坏消息是这个问题是无法解决的,但好消息是这意味着使用LLVM使其不会变得更糟,所以我可以自由地这样做,并获得它的所有优点。

构build多个平台的Linux二进制文件

帮我解决一个分数。 我有一个用C ++编写的软件,可以在尽可能多的Linux发行版上运行,我需要找出一个有效的策略。 我试图在这种情况下运输二进制文件而不是源代码(可能是很好的知道)。 这已经是一个商业产品,我有知识产权问题,阻止我开源产品,但也意味着我必须处理无数的GPL问题。 目前的推理线是select一个最不起眼的分母,并把所有东西都build立起来。 这有两个主要的含义,我觉得反作用。 旧版GCC中的C ++支持缺less一些更加现代的C ++特性。 最不共同点是红帽企业Linux 4(RHEL4) 我绝对不需要整个C ++ 11function集,但是我想把C ++支持提高到Visual C ++ 2010.我正在细读使用Clang / libc ++而不是GCC / libstdc ++在可能的情况。 对于构buildC ++应用程序,RHEL4似乎没有广泛的跨平台支持。对于不同版本的Linux中ABI的稳定性,我还没有多less见识,但是我担心RHEL4比麻烦更麻烦。 试图build立基于less数的所有分布是不可行的策略。 我假设编译不同版本的Linux软件最好是通过目标平台上的工具编译目标平台的软件来完成的。 如果你不接受这个,我现在也在假设你将跨Linux平台运行大量的可移植性问题。 不要谈论你可以或不能链接的许多库,因为跨平台/发行版的C ++ ABI不稳定。 但是我可能是错的,我想听取定期处理这个问题的人的意见。 什么工作,为什么? 或者更重要的是,什么不行?

GLIBCXX版本

如果我在我的机器上编译一个C ++程序,并在另一个(使用较旧的软件)上运行它,则会得到: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found . /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found 。 实际上在我的系统上glibc更新(我得到了gcc-libs 4.5.1:libstdc ++。so.6.0.14)和strings /usr/lib/libstdc++.so.6 | grep GLIBCXX strings /usr/lib/libstdc++.so.6 | grep GLIBCXX从strings /usr/lib/libstdc++.so.6 | grep GLIBCXX打印到GLIBCXX_3.4.14 。 在另一个系统上,它只打印到GLIBCXX_3.4.8 (我有libstdc ++。so.6.0.8)。 所以我有几个问题: 为什么我的链接程序将C ++二进制文件与libstdc ++版本GLIBCXX_3.4.9而不是GLIBCXX_3.4.14 ? 如果我GLIBCXX_3.4 libstdc ++版本GLIBCXX_3.4编译我的二进制文件, GLIBCXX_3.4我猜它几乎在任何地方运行。 这是否意味着任何问题? (例如:它会使用更老的algorithm,因此更糟糕的algorithm实现?) 如果相反,我静静地链接我的程序对我的libstdc ++,我想它会运行到处; 当然,这个二进制文件会更大(〜1MB),其他的优点和缺点呢? 我可以强制链接器链接我的二进制文件与给定版本的libstdc ++吗?

阻止MSYS'bash'杀死陷阱^ C的进程

我有一个控制台模式的Windows应用程序(从Unix移植),最初devise为在收到^ C (Unix SIGINT )时进行干净的退出。 在这种情况下,一个干净的退出涉及等待,可能相当长的时间,远程networking连接closures。 (我知道这不是^ C的正常行为,但我不能改变它。)这个程序是单线程的。 我可以捕获^ C signal(SIGINT) (如在Unix下)或SetConsoleCtrlHandler 。 当程序在CMD.EXE下运行时,可以正常工作。 但是,如果我使用MSYS附带的“bash”shell(我正在使用MinGW环境来构build程序,因为这样我可以重新使用Unix makefiles),那么程序会被强制终止一些随机的短时间100毫秒)。 这是不可接受的,因为正如我所提到的,程序需要等待远程networking连接closures。 人们很可能会希望在MSYS bash下运行这个程序。 此外,这个效果打破了testing套件。 我一直无法find任何方法来解决这个问题,无论是从程序(理想)还是通过shell的设置(可以接受)。 谁能推荐任何东西?

使用免费工具开发轻量级(无运行时)基于Windows的GUI应用程序

有谁知道可以支持在Windows平台上开发GUI应用程序的免费工具(语言,环境)吗? 我正在寻找能够创build一个单一的可执行文件,不依赖于任何外部运行时或库。 我希望能够以与Process Explorer或SysInternals的Autoruns非常相似的方式运行此EXE。 换一种说法; 没有安装程序,便携式应用程序。 此应用程序还必须提供一个相当丰富的窗口(控件,小部件等)用户界面,并应运行在Windows 2000,XP,Vista和更高版本。 我知道C / C ++,但我正在寻找一种环境/语言,为GUI开发提供更多特定和更快的支持。 另外,delphi也花钱。

Grand Central Dispatch(`libdispatch`)是否可以在Windows上使用?

我正在研究multithreading,GCD似乎比使用pthread.h和pthreads-win32手动编写解决scheme更好。 不过,尽pipe看起来libdispatch正在开发或即将开始工作,但是大多数新的POSIX兼容系统…我必须问,Windows怎么样? libdispatch移植到Windows有什么机会? 防止这种情况发生的障碍是什么? 如果说到这一点, 我需要做些什么来预制这个portage? 编辑:我已经知道的一些事情,开始讨论: 我们需要一个可在Windows上编译的块兼容编译器,不是吗? PLBlocks会处理吗? 我们可以使用LLVM 块的运行时间吗? 我们libdispatch用APR调用replace用户空间libdispatch所有pthread.h依赖项,以实现可移植性吗? 或者,或者,使用pthreads-win32我想… 编辑1:我听说,这是完全不可能的,永远不会,因为libdispatch (不知何故)取决于kqueue ,它不能在Windows上提供…有没有人知道这是真的吗?

Windows相当于Linux命名空间(每进程文件系统挂载)?

Linux有一个称为命名空间的function,它可以让您将文件系统的不同“视图”分配给不同的进程。 在Windows中,如果你有一个传统的程序“floyd”,总是从C:\floyd\floyd.ini加载它的configuration,这将是有用的。 如果Windows有命名空间,你可以编写一个封装脚本来创build一个运行floyd的命名空间,当Alice运行脚本时,floyd会在一个C:\floyd存在但实际上指向C:\Users\Alice\Floyd 。 现在你可能会想:“好的,只要使用软链接或硬链接,并为C:\Users\Alice制作C:\floyd别名即可。 但是对于命名空间,Bob也可以运行启动脚本,但是他的floyd实例(在同一台计算机上同时运行)将会看到C:\floyd ,内容为C:\Users\Bob\Program Settings\Floyd Config (或其他我们喜欢的path)。 你可以在Linux上用命名空间来做到这一点。 在Windows上有类似或相似的东西吗? 如果它需要编写一个C程序,那就好了,如果它只适用于最新版本的Windows,那也没关系。

在C ++中的可移植wchar_t

在C ++中是否有可移植的wchar_t? 在Windows上,它的2个字节。 一切都是4个字节。 我想在我的应用程序中使用wstring,但是如果我决定将它移植到端口上,会造成问题。