5

我在 directory1 中有一个头文件 myheader.h 和一个静态库 libmylib.a 文件。在 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 是库中的函数之一。

4

2 回答 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
于 2013-02-23T22:06:18.513 回答
2

使用-lmylib会有问题。对于非静态库,您需要摆弄变量 LD_LIBRARY_PATH; 请参阅为什么每次运行应用程序时都必须使用导出定义 LD_LIBRARY_PATH?. 您可以通过添加-L ../directory1. 但最简单的就是替换-lmylib../directory1/libmylib.a.

例如:

目录 1/mylib.c

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

目录 1/Makefile

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

目录 1/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
于 2013-02-23T21:16:31.887 回答