如何在C Makefile中使用外部库和头文件?

5

我有一个头文件myheader.h和一个静态库libmylib.a文件在directory1目录下。在directory2目录下,我正在编写一个使用它们的程序。假设我在directory2中有main.c,它使用myheader.h和libmylib.a。如何创建一个Makefile来编译和链接它们?

现在,在我的main.c中,我已经添加了:

#include "../directory1/myheader.h"

这是我目前的Makefile:

CC = gcc

INCLUDES = -I

CFLAGS = -g -Wall $(INCLUDES)

main: main.o ../directory1/libmylib.a
    $(CC) main.o ../directory1/libmylib.a -o main

main.o: main.c ../directory1/myheader.h
    $(CC) $(CFLAGS) -c main.c

我收到了以下警告:

gcc -g -Wall -I -c main.c
/home/me/directory2/main.c:72: undefined reference to `foo'
collect2: ld returned 1 exit status
make: *** [main.o] Error 1

其中foo是库中的一个函数之一。


我认为“-L”没有起到帮助作用。 - Joseph Quinsey
似乎链接存在问题。 - ask
2个回答

6

好的,已经解决。

我删除了 #include "../directory1/myheader.h",并替换为 #include "myheader.h"

然后在 Makefile 中,我使用了:

CC = gcc

INCLUDES = -I../directory1

CFLAGS = -g -Wall $(INCLUDES)

LDFLAGS = -L../directory1

main: main.o ../directory1/libmylib.a
    $(CC) main.o $(LDFLAGS) -lmylib -o main

main.o: main.c ../directory1/myheader.h
    $(CC) $(CFLAGS) -c main.c

2
使用-lmylib会有问题。对于非静态库,您需要调整变量LD_LIBRARY_PATH; 参见为什么每次运行我的应用程序时都必须使用导出定义LD_LIBRARY_PATH?。您可以通过添加-L ../directory1来修复您的makefile。但最简单的方法就是将-lmylib替换为../directory1/libmylib.a
例如:

directory1/mylib.c

#include "../directory1/myheader.h"
void foo(void) {}

directory1/Makefile

libmylib.a: mylib.o
    ar r $@ $?

directory1/main.c:

#include "../directory1/myheader.h"
int main(void) {
   foo();
   return 0;
}

目录1/Makefile


main: main.o ../directory1/libmylib.a
   gcc main.o ../directory1/libmylib.a -o main

已做出更改。将我收到的警告添加到问题中。有何建议? - ask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接