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 ++吗?

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,但是如果我决定将它移植到端口上,会造成问题。

将非蝙蝠扩展文件作为batch file运行

假设我有一个文本文件,它包含批处理命令。 我怎样才能从一个batch file运行该文本文件, 而无需重命名。 我也想保留一个可移植的方面,所以没有registry键或这样的。 不重命名的原因也是防止意外closures时剩下的未命名文件。

如何使用printf显示off_t,nlink_t,size_t和其他特殊types?

在我的程序中,我统计他们想要的文件并发送数据。 一个stat struct的字段都是特殊的types: struct stat { dev_t st_dev; /* ID of device containing file */ ino_t st_ino; /* inode number */ mode_t st_mode; /* protection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ dev_t st_rdev; /* device ID […]

什么是最小的Windows(PE)可执行文件?

作为编写编译器的先驱,我试图了解Windows(32位)便携式可执行文件格式。 特别是我希望看到一个裸机可执行文件,除了正确加载,运行和退出之外什么也不做。 我已经尝试编写和编译一个简单的C主函数,它除了生成的.exe是〜22KB,并且包含从KERNEL32.DLL(可能被LIBC用来设置环境,堆等)的许多import。 即使是DOS头可能会更小(它目前打印默认“这个程序不能在DOS模式下运行”)。 什么是最小的Windows 32位可执行文件的结构?