使用VScode学习makefile遇到的问题
1.使用makefile 的shell 函数 find命令查找文件时一直出错
文件目录
Makefile
文件和文件夹src
和文件add.cpp
都在
D:\Program Files\Microsoft VS Code\codeProject\Test
路径下
最初报错
- Makefile文件内指令:
cpp_srcs := $(shell find src -name *.cpp)
debug:
@echo $(cpp_srcs)
- 执行:(我的make指令是mingw32-make)
mingw32-make debug
- 报错:
- 在终端直接使用find命令时,通过
find /?
出现的提示为:
所以这里的find应该不是shell 中的find,这里的find是从某个文件里搜索字符串
改用shell cat试一下
-
直接在终端使用cat 可以正常获取内容
-
Makefile文件中指令
cpp_srcs := $(shell cat add.cpp)
debug:
@echo $(cpp_srcs)
- 执行
mingw32-make debug
- 报错
2. mkdir时提示命令语法不正确
简述:终端使用 mkdir -p obj/
能够成功创建文件夹obj。在makefile中使用dir函数的指令 $(dir $@)
也能够正确获取$@中的路径,但是@mkdir -p $(dir $@)
报错语法不正确。
-
目的:创建.o存放的文件夹
obj/add.o : add.cpp @echo $(dir $@) @mkdir -p $(dir $@) @g++ -c $^ -o $@
- 报错:
- 报错:
-
将
@mkdir -p $(dir $@)
替换为mkdir -p obj/
obj/add.o : add.cpp @echo $(dir $@) @mkdir -p obj/ @g++ -c $^ -o $@
能够成功创建:
3. 动态库连接指令
- 链接部分的makefile内容:
makefile workspace/exec : objs/main.o @echo $^ -o $@ $(linking_options) @g++ $^ -o $@ $(linking_options)
输出值:(libanm.so在当前目录的lib文件夹里)
红框1是将指令打印出来,红框2为报错结果
- 尝试一下在终端直接使用g++指令:但是显示缺少参量,主要在
-Wl,-rpath=./lib
中的逗号上
附:整个makefile文件,
cpp_srcs := src/add.cpp src/minus.cpp src/main.cpp
#$(shell find src -name *.cpp) shell find 找不到cpp
cpp_objs := $(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))
so_objs := $(filter-out objs/main.o, $(cpp_objs))
include_paths := ./include
library_paths :=./lib
linking_libs := anm # 库名称
I_options := $(include_paths:%=-I%)
l_options := $(linking_libs:%=-l%)
L_options := $(library_paths:%=-L%)
r_options := $(library_paths:%=-Wl,-rpath=%)
compile_options := -g -O3 -w -fPIC $(I_options)
linking_options := $(L_options) $(l_options) $(r_options)
makefoder :
@mkdir objs
@mkdir lib
@mkdir workspace
#这里有个循环,因为.cpp不止一个,将文件夹创建拿出
objs/%.o : src/%.cpp makefoder
@g++ -c $< -o $@ $(compile_options)
lib/libanm.so : $(so_objs)
@g++ -shared $^ -o $@
dynamic : lib/libanm.so
@echo "share_library created successfully!"
workspace/exec : objs/main.o dynamic
@echo $^ -o $@ $(linking_options)
@g++ $^ -o $@ $(linking_options)
run : workspace/exec
@./$<
debug :
@echo $(so_objs)
clean :
@del -rf lib objs workspace
.PHONY : debug clean run
运行run
后除了workspace/exec
部分其他都已正常完成,得到文件目录:
Test
|-include
| |-add.hpp
| |-minus.hpp
|-lib
| |-libanm.so
|-objs
| |-add.o|
| |-main.o
| |-minus.o
|-src
| |-add.cpp
| |-main.cpp
| |-minus.cpp
|-workspace