如何在 C 中使用 gcc link 子文件夹?

How to link a subfolder with gcc in C?

我有下面的树:

├── cminpack
│   ├── hybrd.c
│   ├── hybrd.o
│   ├── hybrj1.c
│   ├── hybrj1.o
│   ├── hybrj.c
│   ├── hybrj.o
│   ├── libminpack.a
│   ├── Makefile
│   ├── minpack.h
│   ├── minpack.h.gch
│   ├── readmeC.txt
│   ├── readme.txt
├── greeter.c
├── greeter.h
├── greeter.o
├── swaps.c
├── swaps.h
├── swaps.o

文件:

#include "./cminpack/minpack.h"
#include "./greeter.h"

swaps.c 中,我从 greeter.c 调用函数,从 cminpack/hybrd.c 调用函数 hybrd_。我想 link greetercminpack 我的 swaps.

我通过 运行 下面的 gcc 命令设法 link greeter:

sudo gcc -c swaps.c greeter.c ;sudo gcc -o swaps swaps.c greeter.c -lm ;./swaps

现在如果我尝试 link cminpack 我是 运行 下面的 gcc 命令:

sudo gcc -c swaps.c greeter.c -I./cminpack;sudo gcc -o swaps swaps.c greeter.c -lm -L /cminpack

这会导致臭名昭著的 linking 错误:

/usr/bin/ld: /tmp/ccxwxt6A.o: in function `fsolve':
swaps.c:(.text+0xfb3): undefined reference to `hybrd_'
collect2: error: ld returned 1 exit status

如何 link 子文件夹?

(gcc 版本 10.2.1 20210110 (Debian 10.2.1-6))

-L cminpack外,您还应将-lminpack添加到gcc命令行。

应该没有理由使用 sudo 来编译这个程序,如果你不能直接调用 gcc,你的系统配置错误,应该修复。 运行 强烈建议不要使用 root 编译器。

使用以下行在主目录中创建一个 Makefile

%.o: %.c greeter.h swaps.h cminpack/minpack.h
    gcc $(CFLAGS) -I cminpack -o $@ $*.c

swap: swap.o greeter.o cminpack/libminpack.a
    gcc $(CFLAGS) -o $@ swaps.o greeter.o -L cminpack -lminpack -lm

cminpack/libminpack.a:
    make -C cminpack