我有一个指向源目录的链接,该目录位于父目录下。链接的内容无法修改。该链接具有标题和.c文件。头文件包括一个“ Config.h”文件。 Config.h只能驻留在父目录中,因为我无法修改链接下的任何内容。我必须使用链接中的源并编译父目录。这是目录结构。
ParentDir
|-TestSrc.c
|-TestSrc.h
|-Config.h
|-Makefile
|-LinkToSrcDir
|-Src.c
|-Src.h(#include "Config.h")
我的makefile非常简单
CC = gcc
INC_DIR = -IParentDir -IParentDir/LinkToSrcDir
CFLAGS = -Wall -Wextra $(INC_DIR)
all: mybin
mybin: TestSrc.o Src.o
$(CC) $(CFLAGS) -o TestSrc.o Src.o
TestSrc.o: TestSrc.c
$(CC) $(CFLAGS) -c TestSrc.c
--- similar code for Src.o ----
Phony: clean (all the usual rm -f)
我的问题是,由于无法修改src.h,因此make总是抱怨找不到Config.h(尝试了几种不同的方法)。如何编写Makefile使src.h在父目录中查找Config.h?
最简单的方法是为编译器标志使用完全限定的路径:
INC_DIR = -I$(CURDIR)/ParentDir -I$(CURDIR)/ParentDir/LinkToSrcDir
请注意,当编译器使用相对路径搜索头文件时,它总是从出现源文件的目录开始。而不是从调用编译器的工作目录开始。
例如,从the GCC manual:
预处理程序查找包含的头文件...首先相对于当前文件的目录
在您的情况下,当前文件是LinkToSrcDir/Src.h
,因此所有路径将相对于目录LinkToSrcDir
展开。
当您在上方说一个链接时,我假设您的意思是symbolic链接。在这种情况下,您可能无法使用类似-I..
的名称,因为那样会使您链接到的目录的父目录。
您几乎别无选择,只能在-I
选项中使用完全限定的路径。