使用makefile仅包含C源项目中的标题文件名



我有一个相当大的项目是不同的c源文件,包括

的标题文件
#include "headername1.h"
#include "headername2.h"

即使您的标题文件(请参见上文)也不是在与包含它们的C源文件相同的路径中。

即我要描述的示例的项目结构是以下

project root folder
    module1/
        src1.c    <- #include "headername1.h"   
    module2/
        src2.c    <- #include "headername1.h" & #include "headername2.h"
    common_includes/
        headername1.h
        headername2.h    

请注意如何遗漏通往标题的路径。该程序仍然按预期编译和执行!

我试图在一个完全不同的项目中理解这是怎么可能的以及如何做到这一点。我有以下项目结构用于测试目的

Project folder
    src/
        main.c
    inc/
        main_include.h
    Makefile

inc/main_include.h:

#ifndef __MAIN_INCLUDE_H__
#define __MAIN_INCLUDE_H__
#define A_VALUE     10
#endif /* __MAIN_INCLUDE_H__ */

src/main.c:

#include <stdio.h>
#if TEST
    /* How to make this work? */
    #include "main_include.h"
#else
    #include "../inc/main_include.h"
#endif
int main(int argc, char *argv[])
{
    printf("A_VALUE = %dn", A_VALUE);
    return 0;
}

makefile:

TARGET  ?= test.out
TEST    ?= 0
ifeq (TEST,1)
# (1) Maybe add something here, but what exactly?
endif
SRC_DIRS :=     
    src                                 
INC_DIRS :=     
    inc
# Extract sources and headers
SRCS := $(foreach src_dir,$(SRC_DIRS),$(wildcard $(src_dir)/*.c))
INCS := $(foreach inc_dir,$(INC_DIRS),$(wildcard $(inc_dir)/*.h))
GCC      = gcc
CFLAGS   = -std=c99 -Wall -O2 -DTEST=$(TEST)
LIBS    :=
ifeq (TEST,1)
# (2) Maybe add something here, but what exactly?
endif
all:
    @$(GCC) $(CFLAGS) $(LIBS) $(SRCS) $(INCS) -o $(TARGET)
clean:
    rm -f *.out

到目前为止

make all TEST=0 && ./test.out 

按预期工作,而

make all TEST=1 && ./test.out

没有。我是99.9%的确定,我可以通过在makefile中的一个或两个IFEQ语句中添加一些功能来解决此问题(符号链接或其他东西..?)。但是,我的问题是我找不到(" Google")任何相关资源或一个简单的示例(我有一个我无法遵循的相当大的项目)。

有人可以提供一个"提示"或一个简单的示例,以实现这一目标?

谢谢!

henrik

解决方案(makefile):

TARGET  ?= test.out
TEST    ?= 0
GCC     ?= gcc
CFLAGS  ?= -std=c99 -Wall -O2 -DTEST=$(TEST)
LIBS    :=
SRC_DIRS :=     
    src                                 
INC_DIRS :=     
    inc
# Extract sources and headers
SRCS := $(foreach src_dir,$(SRC_DIRS),$(wildcard $(src_dir)/*.c))
ifeq ($(TEST),1)
INCS    := $(foreach inc_dir,$(INC_DIRS),-I$(inc_dir))
else
INCS    := $(foreach inc_dir,$(INC_DIRS),$(wildcard $(inc_dir)/*.h))
endif
all:
    @$(GCC) $(CFLAGS) $(LIBS) $(SRCS) $(INCS) -o $(TARGET)
clean:
    rm -f *.out

添加-i ../inc to您的incs或您的CC命令行允许您从列出的任何目录中#include" some -header -file.h" complude of -i

最新更新