unix示例中的高级编程ls(1)命令错误

时间:2017-05-24 07:43:03

标签: c unix

#include "apue.h"
#include <dirent.h>

int main(int argc, char *argv[])
{
    DIR     *dp;
    struct dirent *dirp;

    if(argc != 2)
        err_quit("usage: ls directory_name");

    if((dp=opendir(argv[1])) == NULL)
        err_sys("can't open %s", argv[1]);

    while((dirp = readdir(dp)) !=NULL)
        printf("%s\n", dirp->d_name);

    closedir(dp);

    exit(0);

}

我下载了apue.h文件,它在当前目录中作为我的源文件。当我尝试使用clang和OS X进行编译时,会发生以下错误。

    1 warning generated.
    Undefined symbols for architecture x86_64:
        "_err_quit", referenced from:
            _main in lsnew-cbcc3e.o
        "_err_sys", referenced from:
            _main in lsnew-cbcc3e.o
    ld: symbol(s) not found for architecture x86_64
    clang error: linker command failed with exit code 1 (use -v to see invocation)

有人能引导我朝正确的方向指出错误吗?这段代码只适用于32位系统吗?

感谢。

2 个答案:

答案 0 :(得分:1)

我不熟悉您正在使用的示例,但您看到的错误是链接器错误:这意味着,虽然头文件apue.h已声明函数存在但实际上没有任何内容定义了函数。

它们应该在另一个.c文件中提供,也许apue.c?然后,您可以将它包含在已编译的程序中,并将其与您的lsnew.c一起列在clang命令行中:

clang -o lsnew apue.c lsnew.c

我无法告诉您哪里可以找到所需文件,但它可能与您找到apue.h的位置相同。

答案 1 :(得分:0)

两个未定义的符号都可以用自己的实现替换。

if(argc != 2)
    err_quit("usage: ls directory_name");

可以写为:

if(argc != 2) {
    printf("usage: ls directory_name");
    return 1;
}

if((dp=opendir(argv[1])) == NULL)
    err_sys("can't open %s", argv[1]);

可以写为:

if((dp=opendir(argv[1])) == NULL) {
    printf("can't open %s", argv[1]);
    return 1;
}