1

Makefile 让我很困惑。我要做的就是将一些函数分离到一个单独的文件中,但我无法编译它。我错过了什么?谢谢!

生成文件:

all: clientfunctions client

clientfunctions.o: clientfunctions.c
    gcc -c clientfunctions.c -o clientfunctions.o

client.o: client.c clientfunctions.o
    gcc -c client.c -o client.o

client: client.o
    gcc client.o -o client

.c 和 .h 文件也很简单:

客户端函数.h

#ifndef _clientfunctions_h
#define _clientfunctions_h
#endif

void printmenu();

客户端函数.c

#include <stdio.h>
#include "clientfunctions.h"

void printmenu() {
    fprintf(stdout, "Please select one of the following options\n");
}

客户端.c

#include "clientfunctions.h"

int main (int argc, char * argv[])
{
    printmenu();
    return 0;
}

这是我得到的错误:

Undefined symbols for architecture x86_64: "_main", referenced from: implicit entry/start for main executable ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [clientfunctions] Error 1

4

4 回答 4

2

试试下面的。

all: client

clientfunctions.o: clientfunctions.c
    gcc -c clientfunctions.c -o clientfunctions.o

client.o: client.c 
    gcc -c client.c -o client.o

client: client.o clientfunctions.o
    gcc client.o clientfunctions.o -o client

这是编写此 Makefile 的更惯用的方法。

all: client

client: client.o clientfunctions.o
    $(CC) -o $@ $^
于 2013-09-03T18:19:57.093 回答
1

您需要编译这两个 .c 文件并将它们链接到您的可执行文件中。您需要依赖clientfunctions.o于您的client目标并将此对象包含在您的链接中以执行此操作

client: client.o clientfunctions.o
    gcc client.o clientfunctions.o -o client
于 2013-09-03T18:17:29.923 回答
1

你工作辛苦了。您可以依赖隐式规则并大大简化您的 makefile,其全部内容可以(可能取决于您使用的 Make)非常简单:

client: client.o clientfunctions.o
于 2013-09-03T18:25:54.607 回答
0

您实际上并没有说什么是错的,除了“我无法编译它”之外,它基本上什么也没告诉我们。下次尝试提供错误消息或其他内容。

但是,这与make没有任何关系。下次您认为您遇到了 makefile 问题时,只需将命令剪切并传递到您的 shell 提示符中。如果它们有效,那么您的问题出在 make 上。如果它们不起作用,那么您的问题在于您的编译命令,您应该查看编译器的文档来解决它。Make 本质上是一个用于以正确的顺序和正确的时间运行 shell 命令的工具。

在您的情况下,-c如果要生成目标文件,则需要将选项添加到编译行。如果没有该选项,编译器将尝试生成可执行文件。

于 2013-09-03T18:20:32.557 回答