gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:08:14 25 4
gpt4 key购买 nike

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

我仍然收到 undefined reference ,例如:

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

这意味着我的 Makefile 不包括位于同一目录中的 SignalMasker.o 文件。

这是我的生成文件:

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位的

最佳答案

您缺少在 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 中使用相同的标志。

关于带有外部 h 和 o 文件的 c++ Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16031777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com