【问题标题】:Did a Mac update ruin my ability to use gcc?Mac 更新是否破坏了我使用 gcc 的能力?
【发布时间】: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
  • 删除所有输出文件(*.omain),然后在一次编译器调用中直接编译这些文件: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

标签: c macos gcc


【解决方案1】:

我解决了这个问题。我不确定是哪个部分修复了它,但安装了 Homebrew 并用它来安装 gcc-10。我也删除了项目并重新开始。

【讨论】:

    【解决方案2】:

    myfunc 会定义类似文件头

    myfunc.h

    void myfunc()
    

    在另一个文件中声明

    myfunc.c

    void myfunc() { printf("hello world"); }
    

    按照以下教程进行操作

    https://developer.gnome.org/anjuta-build-tutorial/stable/build-make.html.en

    【讨论】:

    • 提问者正是这样做的。这个答案没有添加任何新内容,也没有解释太多。
    猜你喜欢
    • 2015-12-07
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2016-02-01
    相关资源
    最近更新 更多