makefile 想将.o文件直接输出到指定的 obj目录下,碰见奇怪问题

happy_lin2006 2019-01-31 05:32:31
文件目录下有四个源代码文件:a.cpp,a.h,b.cpp,b.h 和一个 Makefile文件,现在想将两个cpp文件生成的.o文件直接生成到当前的obj路径下,总是碰到奇怪的问题。
Makefile:
CXX	= g++

CXXFLAGS = -g -shared -fPIC -Xlinker --unresolved-symbols=ignore-in-shared-libs
LDPFALGS = -lrt -lpthread
# define compiling temporary dir
CPP_FILES := $(wildcard *.cpp)
OBJ_FILES := $(addprefix ./obj/,$(notdir $(CPP_FILES:.cpp=.o)))

all:$(OBJ_FILES)

$(OBJ_FILES): $(CPP_FILES)
$(CXX) $(CXXFLAGS) -c -o $@ $<

clean:
rm -rf $(OBJ_FILES)



执行结果:
g++ -g -shared -fPIC -Xlinker --unresolved-symbols=ignore-in-shared-libs -c -o obj/a.o a.cpp
g++ -g -shared -fPIC -Xlinker --unresolved-symbols=ignore-in-shared-libs -c -o obj/b.o a.cpp

也就是所有的.o文件都是由a.cpp生成的。

为什么?
...全文
1207 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
happy_lin2006 2019-02-01
  • 打赏
  • 举报
回复
那正确的是咋样滴?
林多 2019-02-01
  • 打赏
  • 举报
回复
引用 5 楼 happy_lin2006 的回复:
问题解决了,但是不知道为什么:
后来将:
$(OBJ_FILES): $(CPP_FILES)
$(CXX) $(CXXFLAGS) -c -o $@ $<

改成:
$(OBJ_PATH)/%.o:%.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<

就可以了。
不清楚这里的%.o:%.cpp$(OBJ_FILES): $(CPP_FILES)什么差别?


刚看到。

%.o:%.cpp 和 $(OBJ_FILES): $(CPP_FILES)

他俩的差别在于,我是这么理解的。
第一种,%.o:%.cpp ,两者为同时赋值,进行循环。
1.o 1.cpp
2.o 2. cpp
所以,$@ $< ,这么取,可以取到每个cpp。

第二种,$(OBJ_FILES): $(CPP_FILES)。。$(CPP_FILES)就是个固定的数组,
每次取。 $< ,只能取到$(CPP_FILES)的第一项。



happy_lin2006 2019-02-01
  • 打赏
  • 举报
回复
问题解决了,但是不知道为什么: 后来将:
$(OBJ_FILES): $(CPP_FILES)
    $(CXX) $(CXXFLAGS) -c -o $@ $<
改成:
$(OBJ_PATH)/%.o:%.cpp
	$(CXX) $(CXXFLAGS) -c -o $@ $< 
就可以了。 不清楚这里的%.o:%.cpp$(OBJ_FILES): $(CPP_FILES)什么差别?
林多 2019-01-31
  • 打赏
  • 举报
回复
额。。。抱歉,才发现,我刚才传上去的,是错误的。
林多 2019-01-31
  • 打赏
  • 举报
回复
$< 表示第一个依赖文件。按照你之前的写法。自然是只有 a.cpp了
林多 2019-01-31
  • 打赏
  • 举报
回复
你应该这么写。

CXX = g++

CXXFLAGS = -g -shared -fPIC -Xlinker --unresolved-symbols=ignore-in-shared-libs
LDPFALGS = -lrt -lpthread
# define compiling temporary dir
CPP_FILES := $(wildcard *.cpp)
OBJ_FILES := $(addprefix ./obj/,$(notdir $(CPP_FILES:.cpp=.o)))
TARGET := test

all:$(TARGET)

%.o: $(CPP_FILES)
$(CXX) $(CXXFLAGS) -c -o $@ $<

$(TARGET):$(OBJ_FILES)
$(CXX) $(CXXFLAGS) -o $@ $^

clean:
rm -rf $(OBJ_FILES)

69,371

社区成员

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

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