2013-02-23 83 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

相關問題