GNU make: Makefile Сборка нескольких файлов .cpp одновременно - PullRequest
3 голосов
/ 30 декабря 2011

Это более конкретный вопрос в конкретном случае.

Вот что у меня есть:

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]$ 

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Очень похоже на INT_DIR и $? используемые переменные неуместны. Я ожидаю это:

$(SYMB_OBJ_DIR)/%.o : %.cpp
    $(CXX) -c $(CC_FLAGS) $(SYMB_X_INCLUDE) -o $@ $<

Вы хотите обновить правила ar для libSymbolXLib.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
1 голос
/ 30 декабря 2011

Убедитесь, что CartoCursor.cpp существует в каталоге, в котором вы запускаете Make.

Также в соответствии с Правилами создания файлов Пола вы должны изменить рецепт $(SYMB_OBJ_DIR)/%.o : %.cpp, чтобы обновить файл с помощьюточное имя цели, а именно:

$(SYMB_OBJ_DIR)/%.o : %.cpp
    $(CXX) -c $(CC_FLAGS) $(SYMB_X_INCLUDE) -o $@ $^

UPD.

То же самое относится к рецепту для libSymbolXLib.a, он должен обновить целевой файл.Вы можете вставить заглушку touch $@ для отладки или, если у @sehe есть упомянутое , добавить правильный рецепт:

libSymbolXLib.a : $(SYMB_X_OBJS)
    ar rcs $@ $^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...