2013-02-23 101 views
3

我在目录1中有一个头文件myheader.h和一个静态库libmylib.a文件。在目录2中,我正在编写一个使用它们的程序。假设我在main2中使用了myheader.h和libmylib.a。我如何创建一个Makefile来编译和链接它们?如何在C 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

我不认为'-L'帮助。 – 2013-02-23 21:27:04

+0

链接似乎存在问题。 – ask 2013-02-23 21:52:14

回答

2

好的。修复。

我删除#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;见Why do I have to define LD_LIBRARY_PATH with an export every time I run my application?。您可以通过添加-L ../directory1来修复您的生成文件。但最简单的事情就是用../directory1/libmylib.a替换-lmylib

例如:

directory1中/ mylib.c

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

directory1中/生成文件

libmylib.a: mylib.o 
    ar r [email protected] $? 

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 
+0

进行了更改。添加了我对这个问题的警告。有什么建议? – ask 2013-02-23 21:24:14

相关问题