在Linux中链接 - 寻找解释

时间:2013-09-07 15:19:01

标签: c linux compilation linker codeblocks

如果有人可以向我解释编译所涉及的整个过程以及链接器的功能(所有这些“编程后退工作”),这可以让我实现整个方案。谢天谢地。

错误是“undefined reference to menu()”

我在Linux上并使用代码块在C中编程。所有文件都在同一个文件夹中。

我现在有3个文件:

maintest.c

#include <stdio.h>
#include "biblioteca.h"
int main() {
    menu(2, "opçao 1", "opçao 2");
}

biblioteca.h

#ifndef _BIBLIOTECA_H_
#define _BIBLIOTECA_H_

#define null '\0'
typedef enum { false, true } boolean;
typedef unsigned short uint;
typedef char* string;


void menu(int count, ...);

#endif

biblioteca.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include "biblioteca.h"

void menu(int count, ...) {
    va_list listPointer;
    va_start(listPointer, count);
    for(int i = 1; i <= count; i++) {
        char *string = va_arg(listPointer, char*);
        line(1, 1);;
        printf("%d ..... %s", i < count ? i : 0 , string);
    }
    va_end(listPointer);
}

如果有人可以试一试并向我解释发生了什么以及为什么这些文件没有相互联系,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

错误是“对菜单()的未定义引用”可能是IDE链接器问题,或者您可能没有正确链接

第二个文件中存在一个问题stdlib.h根据需要包含sys/types.h,此头文件包含此类型的定义

typedef unsigned int uint;

在你的头文件中你也有同样的事情。

因此,您将收到conflicting types

错误

这可以通过在第二个文件中删除头文件的包含来避免,否则你可以删除包含stdlib.h(不建议这样做)。

如果您使用Linux.please尝试使用GCC.use -Wall选项来检查是否有任何警告。故意评论(1,1);因为在GCC中对行进行了粗体引用。确保您的三个文件位于编译代码的同一目录中。另外,你需要提供文件的绝对路径。

 gcc -Wall maintest.c  biblioteca.c -o result   

./result

maintest.c

#include <stdio.h>
#include "biblioteca.h"
int main() {
    menu(2, "opç 1", "opç 2");
}

biblioteca.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>

void menu(int count, ...) {
    int i;
    va_list listPointer;
    va_start(listPointer, count);
    for( i = 1; i <= count; i++) {
        char *string = va_arg(listPointer, char*);
    //    line(1, 1);
        printf("%d ..... %s", i < count ? i : 0 , string);
    }
    va_end(listPointer);
} 

biblioteca.h

#ifndef _BIBLIOTECA_H_
#define _BIBLIOTECA_H_

#define null '\0'
typedef enum { false, true } boolean;
typedef unsigned short uint;
typedef char* string;

void menu(int count, ...);

#endif