GNU make: Makefile一次构建多个.cpp文件
GNU make: Makefile Build Multiple .cpp Files at Once
这是一个具体情况下的具体问题。
我有:
SRC =
CartoCursor.cpp
CartoOperatorFactory.cpp
CurveHelper.cpp
$(NULL)
CXX = g++
CC_FLAGS = -fPIC -Wall
SYMB_OBJ_DIR = ./obj/symb_obj
SYMB_X_INCLUDE = -I../../../MYLIBS
SYMB_X_OBJS = $(SRC:%.cpp=$(SYMB_OBJ_DIR)/%.o)
all : libSymbolXLib.a
libSymbolXLib.a : $(SYMB_X_OBJS)
rm -f $@
$(SYMB_OBJ_DIR)/%.o : %.cpp
$(CXX) -c $(CC_FLAGS) $(SYMB_X_INCLUDE) -o $(INT_DIR)/$*.o $?
当我运行这个时,我得到以下错误:
make[1]: *** No rule to make target `obj/symb_obj/CartoCursor.o', needed by `libSymbolXLib.a'. Stop.
我需要做什么才能让libSymbolXLib识别通用构建规则?
如果不清楚,请告诉我。
使用:
CXX = g++
CC_FLAGS = -fPIC -Wall
SYMB_OBJ_DIR = ./obj/symb_obj
SYMB_X_INCLUDE = -I../../../MYLIBS
SYMB_X_OBJS = $(SRC:%.cpp=$(SYMB_OBJ_DIR)/%.o)
all : libSymbolXLib.a
libSymbolXLib.a : $(SYMB_X_OBJS)
ar rcs $@ $^
$(SYMB_OBJ_DIR)/%.o : %.cpp
$(CXX) -c $(CC_FLAGS) $(SYMB_X_INCLUDE) -o $@ $
[mehoggan@hogganz400 Core]$ make
mkdir -p ./libs
mkdir -p ./obj/symb_obj
make -f ./Graphic/SymbolXLib/Makefile
make[1]: Entering directory `/home/mehoggan/arcgis-new/GraphicsCore_Dev/Runtime/Core'
make[1]: *** No rule to make target `obj/symb_obj/CartoCursor.o', needed by `libSymbolXLib.a'. Stop.
make[1]: Leaving directory `/home/mehoggan/arcgis-new/GraphicsCore_Dev/Runtime/Core'
make: *** [build_symbol_x_lib] Error 2
[mehoggan@hogganz400 Core]$ make --version
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-redhat-linux-gnu
[mehoggan@hogganz400 Core]$ uname -a
Linux hogganz400.esri.com 2.6.32-71.el6.x86_64 #1 SMP Wed Sep 1 01:33:01 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
[mehoggan@hogganz400 Core]$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.0 (Santiago)
[mehoggan@hogganz400 Core]$
看起来很像INT_DIR
和$?使用的变量不合适。我希望这样:
$(SYMB_OBJ_DIR)/%.o : %.cpp
$(CXX) -c $(CC_FLAGS) $(SYMB_X_INCLUDE) -o $@ $<
您将需要更新libSymbolXLib的ar规则。a也不只是rm
:)
下面的例子在我的系统上运行得很好:
SRC =
CartoCursor.cpp
CartoOperatorFactory.cpp
CurveHelper.cpp
$(NULL)
CXX = g++
CC_FLAGS = -fPIC -Wall
SYMB_OBJ_DIR = ./obj/symb_obj
SYMB_X_INCLUDE = -I../../../MYLIBS
SYMB_X_OBJS = $(SRC:%.cpp=$(SYMB_OBJ_DIR)/%.o)
all : libSymbolXLib.a
libSymbolXLib.a : $(SYMB_X_OBJS)
ar rcs $@ $^
$(SYMB_OBJ_DIR)/%.o : %.cpp
$(CXX) -c $(CC_FLAGS) $(SYMB_X_INCLUDE) -o $@ $<
演示:$
touch CartoCursor.cpp CartoOperatorFactory.cpp CurveHelper.cpp
$mkdir -pv obj/symb_obj
$make
g++ -c -fPIC -Wall -I../../../MYLIBS -o obj/symb_obj/CartoCursor.o CartoCursor.cpp g++ -c -fPIC -Wall -I../../../MYLIBS -o obj/symb_obj/CartoOperatorFactory.o CartoOperatorFactory.cpp g++ -c -fPIC -Wall -I../../../MYLIBS -o obj/symb_obj/CurveHelper.o CurveHelper.cpp ar rcs libSymbolXLib.a obj/symb_obj/CartoCursor.o obj/symb_obj/CartoOperatorFactory.o obj/symb_obj/CurveHelper.o
$
file libSymbolXLib.a
libSymbolXLib.a: current ar archive
确保CartoCursor.cpp
存在于您运行Make的目录中。
同样,根据Paul的Makefiles规则,您应该修改$(SYMB_OBJ_DIR)/%.o : %.cpp
的recipe以使用目标的确切名称更新文件,即:
$(SYMB_OBJ_DIR)/%.o : %.cpp
$(CXX) -c $(CC_FLAGS) $(SYMB_X_INCLUDE) -o $@ $^
乌利希期刊指南。
同样适用于libSymbolXLib.a
的recipe,它必须更新目标文件。您可以插入touch $@
存根用于调试,或者像@sehe提到的那样添加适当的配方:
libSymbolXLib.a : $(SYMB_X_OBJS)
ar rcs $@ $^
相关文章:
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何在 Eclipse 中一次从多个源文件进行构建
- 如果初始化需要shared_from_this,如何在一次调用中构建一个类
- 如何一次在Visual Studio 2015和Visual Studio 2002中构建C 项目
- cmake-一次针对多个体系结构,而无需在构建之间进行手动清理
- Android Studio Cmake曾经为所有构建变体构建一次
- GNU make: Makefile一次构建多个.cpp文件
- 使用CMake只构建一次外部库