gcc如何指定目标文件的输出目录?

leehq 2006-12-25 06:13:49
例如我有这个几个文件:
1.c 2.c 3.c
我想将编译后的目标文件(就是*.o的文件)放到目录output下,改怎么做?

难道只能这样:
gcc -c 1.c -o output/1.o
gcc -c 2.c -o output/2.o
gcc -c 3.c -o output/3.o

不能一条命令就搞定吗?
...全文
5844 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
chb79 2007-01-11
  • 打赏
  • 举报
回复
leehq(没有读过高中的人) ( ) 信誉:99 Blog 2007-01-10 14:06:00 得分: 0

下面这样的语法能够运行?
gcc $(SOURCES) -o $(OBJS)

你自己看看:
gcc 1.c 2.c -o 1.o 2.o
这样还不错?
-----------------------------------------------------

To leehq(没有读过高中的人):
定义了$(SOURCES), $(OBJS)之后,命令行不是像你说的那样
gcc $(SOURCES) -o $(OBJS)
而应该是:
$(OBJS): output/%.o:%.c
gcc -c $< -o $@

至于为什么这样,这就是makefile的自动变量: %,@,< 的神奇之处啦:)

你可以google一下makefile,自己在研究研究。

下面这个是一个完整的makefile,功能简单,就是将obj放到 output下,你好好研究研究

SRCS := $(wildcard *.c)
OBJS := $(patsubst %.c,output/%.o,$(SRCS))

TARGET := hello

all: $(TARGET)

clean:
rm -f $(TARGET) $(OBJS)

$(TARGET):$(OBJS)
gcc -o $(TARGET) $(OBJS)

$(OBJS):output/%.o:%.c
gcc -c $< -o $@




leehq 2007-01-11
  • 打赏
  • 举报
回复
我还不知道makefile里的目标名可以带两个冒号。

多谢
chb79(哈哈镜)
!!!!!!!!!!!!!!!1
lk_517 2007-01-10
  • 打赏
  • 举报
回复
OBJS = $(patsubst %.c,%.o,$(SOURCES))

然后就把.c和.o对应起来了阿,你就不用管具体文件名了阿

然后gcc $(AppName) -o $(OBJS)

晕,这个自己试一下就行了阿

怎么会出现gcc $(SOURCES) -o $(OBJS)这种写法?

虽然现在有万能文件,不过建议你还是看看makefile写法
leehq 2007-01-10
  • 打赏
  • 举报
回复
chb79(哈哈镜)

你真是神了!
多谢多谢!
leehq 2007-01-10
  • 打赏
  • 举报
回复
lk_517(风雷,http://likunarmstrong.googlepages.com/home)

leehq:

为什么不行?错误信息是什么
-----------------------------------------------------
下面这样的语法能够运行?
gcc $(SOURCES) -o $(OBJS)

你自己看看:
gcc 1.c 2.c -o 1.o 2.o
这样还不错?
leehq 2007-01-09
  • 打赏
  • 举报
回复
还有没有高手来指点一下?
chb79 2007-01-09
  • 打赏
  • 举报
回复
一个适合中小规模的makefile模版,基本上自己按照实际情况指定一下 源文件,目标文件,头文件目录,以及源文件后缀就行了。

# ---------------------------------------------------------------------------
# commands
# ---------------------------------------------------------------------------
CC := gcc
LINK := gcc
RM := rm -rf
MV := mv
TAR := tar
MKDIR := mkdir


# ---------------------------------------------------------------------------
# settings
# ---------------------------------------------------------------------------
SRC_SUFFIX := .c
OBJ_SUFFIX := .o
LIB_SUFFIX := .a
BIN_SUFFIX := .exe
DLL_SUFFIX := .so

INC_PREFIX := -I
LIB_PREFIX := -L

OPT_C := -c
OPT_OUT := -o
OPT_LINKOUT := -o

CFLAGS := $(OPT_C)
LIBFLAGS := -Debug


# ---------------------------------------------------------------------------
# directories
# ---------------------------------------------------------------------------
SRC_DIR := ./src
OBJ_DIR := ./obj
INC_DIR := ./inc
LIB_DIR := ./lib /usr/local/lib /lib /usr/lib


# ---------------------------------------------------------------------------
# common settings
# ---------------------------------------------------------------------------
SRCS := $(wildcard $(SRC_DIR)/*$(SRC_SUFFIX))
OBJS := $(patsubst $(SRC_DIR)/%$(SRC_SUFFIX),$(OBJ_DIR)/%$(OBJ_SUFFIX),$(SRCS))
INCS := $(addprefix $(INC_PREFIX), $(INC_DIR))
LIBS := $(addprefix $(LIB_PREFIX), $(LIB_DIR)) $(LIBFLAGS)
TEMPFILES := core core.* *$(OBJ_SUFFIX) temp.* *.out typescript*


# ---------------------------------------------------------------------------
# make rule
# ---------------------------------------------------------------------------
TARGET := loader

.PHONY: all clean

all: $(TARGET)

clean:
$(RM) $(TARGET)$(BIN_SUFFIX) $(OBJS)

$(TARGET):$(OBJS)
$(LINK) $(OPT_LINKOUT)$(TARGET)$(BIN_SUFFIX) $(LIBS) $(OBJS)

$(OBJS):$(OBJ_DIR)/%$(OBJ_SUFFIX):$(SRC_DIR)/%$(SRC_SUFFIX)
$(CC) $(CFLAGS) $(INCS) $(OPT_OUT)$@ $<
lk_517 2007-01-09
  • 打赏
  • 举报
回复
leehq:

为什么不行?错误信息是什么
leehq 2007-01-07
  • 打赏
  • 举报
回复
lk_517(风雷,http://likunarmstrong.googlepages.com/home)

当然看了,晕

在makefile里面写

SOURCES = $(wildcard *.c)

OBJS = $(patsubst %.c,%.o,$(SOURCES))

然后就把.c和.o对应起来了阿,你就不用管具体文件名了阿
------------------------------------------------------------
这样写我也会,问题是你如何编译?
难道这样:
gcc $(SOURCES) -o $(OBJS)

好像不行啊????????
lbaby 2007-01-07
  • 打赏
  • 举报
回复
多看点有关文档,呵呵
lk_517 2007-01-01
  • 打赏
  • 举报
回复
当然看了,晕

在makefile里面写

SOURCES = $(wildcard *.c)

OBJS = $(patsubst %.c,%.o,$(SOURCES))

然后就把.c和.o对应起来了阿,你就不用管具体文件名了阿

leehq 2006-12-31
  • 打赏
  • 举报
回复
lk_517(风雷,http://likunarmstrong.googlepages.com/home)
------------------------------------------------------------
你没看贴?
leehq 2006-12-30
  • 打赏
  • 举报
回复
duchuanying()
.c.o:
gcc -c $< -o output/$@

就可以了呀!

对于每个.c都执行 gcc 1.c -o output/1.o

----------------------------

即使这样写,好像也要先把文件名一个个打上吧···

例如:
OBJECTS=1.o 2.o 3.o
.SUFFIXES: .o .c
.c.o:
gcc -c $< -o $(OUTDIR)/$@
all: $(OBJECTS)
1.o : 1.c
2.o : 2.c
3.o : 3.c
lk_517 2006-12-30
  • 打赏
  • 举报
回复
to leehq


用makefile阿
yin0731 2006-12-30
  • 打赏
  • 举报
回复
写MAKEFILE文件
leehq 2006-12-30
  • 打赏
  • 举报
回复
?
leehq 2006-12-30
  • 打赏
  • 举报
回复
lk_517(风雷,http://likunarmstrong.googlepages.com/home) ( )
SOURCES = $(wildcard *.c)

OBJS = $(patsubst %.c,%.o,$(SOURCES))
---------------------------------------------------------
这样怎么设定编译的语句?
难道这样:
gcc -c $(SOURCES) -o $(OBJS)
好像不通啊?
lk_517 2006-12-30
  • 打赏
  • 举报
回复
SOURCES = $(wildcard *.c)

OBJS = $(patsubst %.c,%.o,$(SOURCES))
leehq 2006-12-29
  • 打赏
  • 举报
回复
难道只能将文件名都打上吗?
不能用"*.c"这类的语法?
duchuanying 2006-12-29
  • 打赏
  • 举报
回复
.c.o:
gcc -c $< -o output/$@

就可以了呀!

对于每个.c都执行 gcc 1.c -o output/1.o
加载更多回复(22)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧