简体   繁体   English

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

[英]How to use external libraries and headers in C Makefile?

I have a header file myheader.h and a static library libmylib.a file in directory1. 我有一个头文件myheader.h和一个在directory1中的静态库libmylib.a文件。 In directory2, I'm writing a program which uses them. 在directory2中,我正在编写一个使用它们的程序。 Suppose I have main.c in directory2 which uses myheader.h and libmylib.a. 假设我在directory2中有main.c,它使用myheader.h和libmylib.a。 How do I create a Makefile to compile and link them? 如何创建Makefile来编译和链接它们?

Right now, in my main.c, I have added 现在,在我的main.c中,我补充说

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

Here's my Makefile at the moment: 这是我的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

I'm getting the following warning: 我收到以下警告:

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

where foo is one of the functions in the library. 其中foo是库中的一个函数。

Ok. 好。 Fixed it. 固定它。

I removed #include "../directory1/myheader.h" and replaced it with #include "myheader.h" . 我删除了#include "../directory1/myheader.h" #include "myheader.h"并将其替换为#include "myheader.h"

Then in the Makefile, I used: 然后在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

Using -lmylib will be a problem. 使用-lmylib将是一个问题。 For non-static libraries you would need to fiddle with the variable LD_LIBRARY_PATH; 对于非静态库,您需要使用变量LD_LIBRARY_PATH; see Why do I have to define LD_LIBRARY_PATH with an export every time I run my application? 为什么每次运行我的应用程序时都必须使用导出定义LD_LIBRARY_PATH? . You could fix your makefile by adding -L ../directory1 . 您可以通过添加-L ../directory1来修复您的makefile。 But the simplest thing is just replace -lmylib with ../directory1/libmylib.a . 但最简单的事情是只需更换-lmylib../directory1/libmylib.a

For example: 例如:

directory1/mylib.c directory1中/ mylib.c

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

directory1/Makefile directory1中/ Makefile文件

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

directory1/main.c: directory1中/ main.c中:

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

directory1/Makefile directory1中/ Makefile文件

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM