如何在makefile中指定链接顺序,这样就不会为一个依赖于另一个

时间:2017-01-31 17:22:37

标签: c++ linux macos gcc makefile

我的类是非常相互依赖的,当我为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 $ @

0 个答案:

没有答案