【发布时间】:2021-04-29 21:21:09
【问题描述】:
我正在尝试将两个 c 文件编译成一个可执行文件。在目录中我只有三个文件; Makefile、main.c 和 myfunction.c。
生成文件:
CC = gcc
CFLAGS = -Wall -g -O0
LIBS = -lm
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
MAIN = main
all: $(MAIN)
@echo Program has been compiled
$(MAIN): $(OBJS)
$(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LIBS)
clean:
$(RM) *.o *~ $(MAIN)
main.c:
#include <stdio.h>
void myfunc();
int main (int argc, char *argv[]) {
myfunc();
return 0;
}
myfunction.c:
#include <stdio.h>
void myfunc() { printf("hello world"); }
make 后输出:
gcc -Wall -g -O0 -c -o main.o main.c
gcc -Wall -g -O0 -c -o myfunction.o myfunction.c
gcc -Wall -g -O0 -o main main.o myfunction.o -lm
Undefined symbols for architecture x86_64:
"_myfunc", referenced from:
_main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [main] Error 1
过去我有一些几乎相同的工作。从那以后,我已经干净安装了 MacOS 并更新到 Big Sur。这是问题还是我忽略了什么?
【问题讨论】:
-
gcc -v的输出是什么 -
配置为:--prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/ MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/4.2.1 Apple clang 版本 12.0.0 (clang-1200.0.32.28) 目标:x86_64-apple-darwin20.2.0 线程模型:posix InstalledDir:/ Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
-
删除所有输出文件(
*.o和main),然后在一次编译器调用中直接编译这些文件:clang -o main main.c myfunction.c。您使用的 makefile 看起来不错 - 通配符是不好的做法,即使它们恰好在此时起作用。当拥有它们会有所帮助时(随着项目的发展),它们会准确地咬你。对于至少小于 100k 行的 C 项目来说,现在的 makefile 没有多大意义——如今编译 C 的速度快得离谱,尤其是在-O0。调用编译器一次并完成它。是的,您可以通过 Makefile 来完成。 -
顺便说一句,如果你没有注意到:你的系统上没有 gcc,所以它不会被破坏:) 它只是
clang的别名,所以你不妨直接它-以防该别名以某种方式配置错误。gcc -v真正的意思是clang -v,等等。我不确定 Apple 多久前停止为 MacOS 提供gcc,但可能至少已经有十年了? -
我还假设你已经从命令行调用了
sudo xcodebuild -license accept?