带有外部h和o文件的c ++ Makefile

时间:2013-04-16 08:05:29

标签: c++ makefile

我有项目文件,我需要使用一个名为TestSuite1.cpp的外部测试文件,其中包含一个外部头文件SignalMasker.h(已经给出它和它的目标文件SignalMasker.o)和我的主头文件uthreads.h

我仍然得到未定义的引用,例如:

TestSuite1.cpp:63: error: undefined reference to 'SignalMasker::~SignalMasker()'

这意味着我的Makefile不包含驻留在同一目录中的SignalMasker.o文件。

这是我的Makefile:

CC = g++
FLAGS = -Wall -g 

OBJECTS = uthreads.o Thread.o Scheduler.o SchedulerStarter.o TestSuite1.o

.PHONY :  clean


all: test1

test1: $(OBJECTS)
    g++  $(FLAGS) $(OBJECTS) SignalMasker.o -L . -o test1


TestSuite1.o  : TestSuite1.cpp SignalMasker.h uthreads.h
    $(CC) -c $(FLAGS) TestSuite1.cpp

uthreads.o  : uthreads.cpp uthreads.h SchedulerStarter.h Scheduler.h Thread.h
    $(CC) -c $(FLAGS) uthreads.cpp 

Scheduler.o  : Scheduler.cpp Scheduler.h Thread.h
    $(CC) -c $(FLAGS) Scheduler.cpp 

SchedulerStarter.o  : SchedulerStarter.cpp SchedulerStarter.h Scheduler.h
    $(CC) -c $(FLAGS) SchedulerStarter.cpp 

Thread.o  : Thread.cpp Thread.h uthreads.h translateAdd.h
    $(CC) -c $(FLAGS) Thread.cpp 

clean:
    rm -f $(OBJECTS) *~

现在我得到了:

~/Desktop/tests$ make
g++  -Wall -g  uthreads.o Thread.o Scheduler.o SchedulerStarter.o TestSuite1.o SignalMasker.o -L . -o test1 
/usr/bin/ld: error: SignalMasker.o: incompatible target
TestSuite1.cpp:36: error: undefined reference to 'SignalMasker::SignalMasker(int)'
TestSuite1.cpp:63: error: undefined reference to 'SignalMasker::~SignalMasker()'
TestSuite1.cpp:63: error: undefined reference to 'SignalMasker::~SignalMasker()'
TestSuite1.cpp:68: error: undefined reference to 'SignalMasker::SignalMasker(int)'
TestSuite1.cpp:111: error: undefined reference to 'SignalMasker::~SignalMasker()'
TestSuite1.cpp:111: error: undefined reference to 'SignalMasker::~SignalMasker()'
collect2: ld returned 1 exit status

修改  我现在正在思考可能不兼容的目标意味着他们在64位下编译它。我的机器是32位

1 个答案:

答案 0 :(得分:0)

您缺少在makefile中编译SignalMasker.cpp的规则。你必须写一条规则,就像你写的一样 SchedulerStarter.o,Thread.o

SignalMasker.o:SignalMasker.cpp SignalMasker.h     $(CC)-c $(FLAGS)SignalMasker.cpp

这将确保使用您构建其他对象的相同编译标志生成SignalMasker.o。在32位/ 64位变体的情况下,它将消除不兼容问题。

如果要从其他地方复制此SignalMasker.o,请检查用于生成对象的编译标志。在makefile中使用相同的标志。