【问题标题】:How to specify the location of a header file when building a shared library构建共享库时如何指定头文件的位置
【发布时间】:2017-05-25 10:04:48
【问题描述】:

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

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

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

这是在 ubuntu 上。

这是生成文件。

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)

【问题讨论】:

    标签: c makefile shared-libraries


    【解决方案1】:

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

    ./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)
    

    【讨论】:

      【解决方案2】:

      您只能在文件中指定它。您放置 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包含cc之后的命令,你可以添加-idirafter ../A/参数。我没有尝试过makefile,但这可以在命令行上使用。所以,它可能会起作用。让我知道:) 谢谢

      【讨论】:

        【解决方案3】:

        您要问的是如何告诉编译器(因为 make 所做的只是触发命令行)标头在哪里。 更具体地说,它是预处理器的工作。

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

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

        【讨论】:

          猜你喜欢
          • 2016-04-29
          • 2011-01-12
          • 2021-05-23
          • 1970-01-01
          • 2020-03-31
          • 1970-01-01
          • 1970-01-01
          • 2012-04-29
          • 1970-01-01
          相关资源
          最近更新 更多