如何在构建共享库时指定头文件的位置

时间:2017-05-25 10:04:48

标签: c makefile shared-libraries

我有两个文件夹,每个文件夹包含.c .h和makefile。它们是库,当我构建它们时,它们会产生一个.so文件。

我想在另一个头文件中包含一个头文件。

当我使用make文件构建它时,如何告诉它头文件在另一个文件夹中?我是否在makefile中指定了它?

这是在ubuntu上。

这是makefile。

CC=gcc

CFLAGS=-c -Wall -Werror -fPIC 

APP1 = tca

all: $(APP1) 

$(APP1): $(APP1).c
$(CC) $(CFLAGS) $(APP1).c $(LIBS)
$(CC) -shared -o lib$(APP1).so $(APP1).o
sudo cp $(APP1).h /usr/include/ 
sudo cp lib$(APP1).so /usr/lib/
sudo chmod 0755 /usr/lib/lib$(APP1).so
sudo ldconfig
sudo ldconfig -p | grep $(APP1)

clean:
rm -rf *.o
rm -rf *.so
rm -rf $(APP1)

3 个答案:

答案 0 :(得分:0)

假设项目目录结构是这样的:

./project_dir
  |-src/      //< Source code folder
  |-include/  //< Folder containing header files
  |-Makefile  //< Makefile for the project

在Makefile中添加以下更改:

CC=gcc

CFLAGS=-c -Wall -Werror -fPIC -I ./include

APP1 = tca

all: $(APP1) 

$(APP1): $(APP1).c
    $(CC) $(CFLAGS) $(APP1).c $(LIBS)
    $(CC) -shared -o lib$(APP1).so $(APP1).o
    sudo cp ./include/$(APP1).h /usr/include/ 
    sudo cp lib$(APP1).so /usr/lib/
    sudo chmod 0755 /usr/lib/lib$(APP1).so
    sudo ldconfig
    sudo ldconfig -p | grep $(APP1)

clean:
    rm -rf *.o
    rm -rf *.so
    rm -rf $(APP1)

答案 1 :(得分:0)

您只能在文件中指定它。放置makefile的位置将是您的主目录。现在假设您有两个目录A和B,每个目录包含一个头文件,您需要包含这些头文件。在主目录中,您想要包含头文件,只需提供这样的路径

#include "../A/header_name.h" //If dir A is on just outside main dir.
#include "./B/header_name.h"  //If dir B is on inside the main dir.

同样,您可以单独包含文件。 如果要通过makefile包含after cc命令,可以添加-idirafter ../A/参数。我没有尝试过makefile,但这可以在命令行上运行。所以,它可能会起作用。让我知道:)谢谢

答案 2 :(得分:0)

你要问的是如何告诉你的编译器(因为make是做什么只是为了触发一个命令行)。 更具体地说,它是预处理器的工作。

使用gcc,您有两种选择:-I dir-iquote dir 前者会将dir添加到预处理期间找到的每个#include指令的搜索路径中,后者仅用于使用引号的#include指令。

Here是有关这些选项的文档。