我的类是非常相互依赖的,当我为gcc 4.2(mac)而不是gcc4.4(linux)构建时,我得到一个未定义的符号。我认为正在发生的是构建顺序正在为mac而不是linux发挥作用。我试图找出如何更改我的makefile以正确执行此操作。我一直在关注order only prerequesites,但我不确定如何为我的makefile执行此操作。
这是我的makefile:
.SUFFIXES: .cpp
DEP_DIR = ../dep
CC = g++
OS := $(shell uname -s)
ifeq ($(OS),Darwin)
#set LIB_DIR
LIB_DIR1=darwin64_gcc42/lib
LIB_DIR2=darwin64_gcc44/lib
else
LIB_DIR=linux64_gcc44/lib
endif
INCDIRS = -I. -I../include \
-I$(DEP_DIR)/s/include \
-I$(DEP_DIR)/t/include
ifeq ($(OS),Darwin)
C++FLAGS = -c -fPIC -g -D_DEBUG -D_FILE_OFFSET_BITS=64 -m64 -Wall
#C++FLAGS = -c -fPIC -O2 -DNDEBUG -D_FILE_OFFSET_BITS=64 -m64 -Wall
else
C++FLAGS = -c -fPIC -g -O2 -DLINUX -D_DEBUG -D_FILE_OFFSET_BITS=64 -m64 -Wall
#C++FLAGS = -c -fPIC -O2 -DLINUX -DNDEBUG -D_FILE_OFFSET_BITS=64 -m64 -Wall
endif
ifeq ($(OS),Darwin)
LDFLAGS = -m64 -pthread -ldl -dynamiclib -L../$(LIB_DIR1)/debug \
-L$(DEP_DIR)/slx/$(LIB_DIR1) \
-L$(DEP_DIR)/tbb/$(LIB_DIR2)/debug
else
LDFLAGS = -m64 -pthread -ldl -shared -L../$(LIB_DIR)/debug \
-L$(DEP_DIR)/s/$(LIB_DIR) \
-L$(DEP_DIR)/t/$(LIB_DIR)/debug
endif
LDLIBS = -lu_debug -ls_debug -lt_debug -ltmalloc_debug
#LDLIBS = -lu -ls -lt -ltmalloc
all: UMetaPlugin UDataPlugin UForPlugin UFacPlugin UTransPlugin UPlugin
UPlugin: UPlugin.o
$(CC) UPlugin.o $(LDFLAGS) -o $@ $(LDLIBS)
UDataPlugin: UDataPlugin.o
$(CC) UDataPlugin.o $(LDFLAGS) -o $@ $(LDLIBS)
UForPlugin: UForPlugin.o
$(CC) UForPlugin.o $(LDFLAGS) -o $@ $(LDLIBS)
UFacPlugin: UFacPlugin.o
$(CC) UFacPlugin.o $(LDFLAGS) -o $@ $(LDLIBS)
UMetaPlugin: UMetaPlugin.o
$(CC) UMetPlugin.o $(LDFLAGS) -o $@ $(LDLIBS)
UTransPlugin: UTransPlugin.o
$(CC) UTransPlugin.o $(LDFLAGS) -o $@ $(LDLIBS)
.cpp.o:
$(CC) $(C++FLAGS) $(INCDIRS) $< -o $@
clean:
rm -rf *.o all
似乎正在发生的是UDataPlugin.cpp实例化UMetaPlugin,并且由于链接是独立的,因此UDataPlugin获取UMetaPlugin的未定义符号。如何推迟链接,以便UDataPlugin在没有UMetaPlugin的情况下不尝试链接?
这似乎适用于mac的命令行,所以这似乎强化了依赖于链接的顺序问题:
g++ -fPIC -g -O2 -D_DEBUG -D_FILE_OFFSET_BITS=64 -m64 -Wall -I. -I../include -I../dependencies/s/include -I../dependencies/t/include UMetaPlugin.cpp UDataPlugin.cpp UForPlugin.cpp UFacPlugin.cpp UMetaPlugin.cpp UPlugin.cpp -ldl -m64 -pthread -dynamiclib -L../darwin64_gcc42/lib/debug -L../dependencies/s/darwin64_gcc42/lib -L../dependencies/t/darwin64_gcc44/lib/debug -lu_debug -ls_debug -lt_debug -ltmalloc_debug
我结束了这个,所以我不必压制undefs,所以它一步到位而不是单独链接: appn = ex
SRCS = UMetaPlugin.cpp UDataPlugin.cpp UForPlugin.cpp UFacPlugin.cpp UMTransPlugin.cpp UPlugin.cpp
objects = $(patsubst%。cpp,%。o,$(SRCS))
全部:$(appn)
$(appn):$(对象) $(CC)$(LDFLAGS)-o $ @ $(对象)$(LDLIBS)
.cpp.o: $(CC)$(C ++ FLAGS)$(INCDIRS)$&lt; -o $ @