社区
C语言
帖子详情
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
不能一条命令就搞定吗?
...全文
6661
44
打赏
收藏
gcc如何指定目标文件的输出目录?
例如我有这个几个文件: 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 不能一条命令就搞定吗?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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)
C语言
70,018
社区成员
243,266
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章