我在BSD平台(OSX)上开发的应用程序中使用了出色的UNIX'comm'命令行实用程序。当我将其部署到Linux生产服务器时,我发现可悲的是,Ubuntu Linux的'comm'实用程序没有采用-i标志来指示应该比较不区分大小写的行。显然,POSIX标准不需要-i选项。

所以...我陷入困境。我真的需要-i选项在BSD上效果很好。到目前为止,我已经尝试在Linux机器上编译BSD comm.c源代码,但是我得到了:

http://svn.freebsd.org/viewvc/base/user/luigi/ipfw3-head/usr.bin/comm/comm.c?view=markup&pathrev=200559

me@host:~$ gcc comm.c
comm.c: In function ‘getline’:
comm.c:195: warning: assignment makes pointer from integer without a cast
comm.c: In function ‘wcsicoll’:
comm.c:264: warning: assignment makes pointer from integer without a cast
comm.c:270: warning: assignment makes pointer from integer without a cast
/tmp/ccrvPbfz.o: In function `getline':
comm.c:(.text+0x421): undefined reference to `reallocf'
/tmp/ccrvPbfz.o: In function `wcsicoll':
comm.c:(.text+0x691): undefined reference to `reallocf'
comm.c:(.text+0x6ef): undefined reference to `reallocf'
collect2: ld returned 1 exit status


关于在Linux上如何获得支持'comm -i'的comm版本,是否有人有任何建议?

谢谢!

最佳答案

您可以在comm.c中添加以下内容:

void *reallocf(void *ptr, size_t size)
{
    void *ret = realloc(ptr, size);
    if (ret == NULL) {
        free(ptr);
    }
    return ret;
}


然后,您应该可以对其进行编译。确保comm.c中有#include <stdlib.h>(可能已经这样做了)。

编译失败的原因是BSD comm.c使用的不是标准C函数的reallocf()。但是很容易写。

关于unix - UNIX'comm'实用程序允许在BSD中区分大小写,但在Linux中不区分大小写(通过-i标志)。如何在Linux中获得它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2153371/

10-11 16:03