我有一个头文件myheader.h和一个在directory1中的静态库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是库中的一个函数。
答案 0 :(得分:3)
确定。修正了它。
我删除了#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
答案 1 :(得分:2)
使用-lmylib
将是一个问题。对于非静态库,您需要使用变量LD_LIBRARY_PATH;见Why do I have to define LD_LIBRARY_PATH with an export every time I run my application?。您可以通过添加-L ../directory1
来修复您的makefile。但最简单的事情就是将-lmylib
替换为../directory1/libmylib.a
。
例如:
directory1中/ mylib.c
#include "../directory1/myheader.h"
void foo(void) {}
directory1中/生成文件
libmylib.a: mylib.o
ar r $@ $?
directory1中/ main.c中:
#include "../directory1/myheader.h"
int main(void) {
foo();
return 0;
}
directory1中/生成文件
main: main.o ../directory1/libmylib.a
gcc main.o ../directory1/libmylib.a -o main