在Microsoft Visual Studio 2013 C ++上使用GNU库(getopt)的未解析的外部符号

时间:2014-05-25 00:56:38

标签: c++ getopt

我没有那么多的编程经验。我正在尝试做的是在我的程序中实现getopt,以便我可以使用参数运行它。

我已经包含了getopt.h,getopt_long.c和所有必需的库。

我收到错误LNK2001:未解析的外部符号opterr,optarg,optind,optopt。

我知道我没有提供有关此问题的更多信息,但我真的不知道还要添加什么。这些文件适用于其他人,因此假设它们没有任何问题。

这可能是什么问题?

编辑:这是代码,虽然这可能不是问题所在

/* Flag set by ‘--verbose’. */
static int verbose_flag;

int
main(int argc, char **argv)
{
    int c;

    while (1)
    {
            static struct option long_options[] =
            {
                    /* These options set a flag. */
                    { "verbose", no_argument, &verbose_flag, 1 },
                    { "brief", no_argument, &verbose_flag, 0 },
                    /* These options don't set a flag.
                    We distinguish them by their indices. */
                    { "add", no_argument, 0, 'a' },
                    { "append", no_argument, 0, 'b' },
                    { "delete", required_argument, 0, 'd' },
                    { "create", required_argument, 0, 'c' },
                    { "file", required_argument, 0, 'f' },
                    { 0, 0, 0, 0 }
            };
            /* getopt_long stores the option index here. */
            int option_index = 0;

            c = getopt_long(argc, argv, "abc:d:f:",
                    long_options, &option_index);

            /* Detect the end of the options. */
            if (c == -1)
                    break;

            switch (c)
            {
            case 0:
                    /* If this option set a flag, do nothing else now. */
                    if (long_options[option_index].flag != 0)
                            break;
                    printf("option %s", long_options[option_index].name);
                    if (optarg)
                            printf(" with arg %s", optarg);
                    printf("\n");
                    break;

            case 'a':
                    puts("option -a\n");
                    break;

            case 'b':
                    puts("option -b\n");
                    break;

            case 'c':
                    printf("option -c with value `%s'\n", optarg);
                    break;

            case 'd':
                    printf("option -d with value `%s'\n", optarg);
                    break;

            case 'f':
                    printf("option -f with value `%s'\n", optarg);
                    break;

            case '?':
                    /* getopt_long already printed an error message. */
                    break;

            default:
                    abort();
            }
    }

    /* Instead of reporting ‘--verbose’
    and ‘--brief’ as they are encountered,
    we report the final status resulting from them. */
    if (verbose_flag)
            puts("verbose flag is set");

    /* Print any remaining command line arguments (not options). */
    if (optind < argc)
    {
            printf("non-option ARGV-elements: ");
            while (optind < argc)
                    printf("%s ", argv[optind++]);
            putchar('\n');
    }

    exit(0);
}

2 个答案:

答案 0 :(得分:1)

由于它们是链接器错误,因此缺少源文件,或者没有链接库。

opterr,optarg,optind和optopt是getopt标题中定义的外部。

getopt_long.c中,它们也被标记为外部。它们在getopt.c中初始化(创建?实际存在?),这不是您列出的文件。

答案 1 :(得分:0)

现在有效。我只是在getopt.c文件中查看并确保所有定义都在那里。如果您遇到类似问题,请确保这样做。