使用 Makefile 仅在 c 源项目中包含头文件名?
Include only the header filename in c source project with Makefile?
我有一个相当大的项目,不同的 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 = %d\n", A_VALUE);
return 0;
}
生成文件:
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") 任何相关资源或一个简单的示例(我有一个相当大的项目,但我无法跟进)。
有人可以提供一个 "hint" 或一个简单的例子来说明如何实现吗?
谢谢!
亨里克
解决方案(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 添加到您的 INCS 或您的 CC 命令行将允许您从使用 -I
列出的任何目录中 #include "some-header-file.h"
我有一个相当大的项目,不同的 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 = %d\n", A_VALUE);
return 0;
}
生成文件:
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") 任何相关资源或一个简单的示例(我有一个相当大的项目,但我无法跟进)。
有人可以提供一个 "hint" 或一个简单的例子来说明如何实现吗?
谢谢!
亨里克
解决方案(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 添加到您的 INCS 或您的 CC 命令行将允许您从使用 -I
列出的任何目录中 #include "some-header-file.h"