деструктор c ++ makefile неопределенная ссылка - PullRequest
0 голосов
/ 25 октября 2011

Для меня это загадка:

c ++ неопределенная ссылка на деструктор

В этом проблема, код такой же, как ссылка, полный make-файл и ошибкиВот.Связанные ответы помогли, но только для того, чтобы подчеркнуть, что у меня есть несколько заголовков в месте, которого я не ожидал.

makefile

CXX = g++

BIN = .

LIBS = -L.

INCLUDE = -I . -I 

CXXFLAGS = -pipe # -O6

LFLAGS = -lm

GeomTest_OBJS   =   geomTest.o SASAGeometry.o

geomTest_source =   SASAGeometry.cpp SASAGeometry.h sasa_transformMatrix.cpp sasa_transformMatrix.h geomSetup.cpp

SASAGeometry.o  :   SASAGeometry.cpp SASAGeometry.h sasa_transformMatrix.cpp sasa_transformMatrix.h

geomTest.o  :   geomSetup.cpp

geomTest    : $(GeomTest_OBJS) makefile
            $(CXX) -o geomTest.o -o SASAGeometry.o $(LIBS) $(INCLUDE) $(CXXFLAGS) $(geomTest_source) $(LFLAGS)
            $(CXX) $(LIBS) $(INCLUDE) $(CXXFLAGS) -o $(BIN)/geomTest geomTest.o SASAGeometry.o $(LFLAGS) 

clean       : \rm *.o *~ p1

Я объявил и создал экземпляр деструктора И не позволялкомпилятор делает свое дело)

ошибка

geomSetup.cpp:(.text+0x5ab): undefined reference to `SASAGeometry::~SASAGeometry()'
geomSetup.cpp:(.text+0x5cd): undefined reference to `SASAGeometry::~SASAGeometry()'

других ошибок нет.(извините, если предпочтительнее рассматривать, казалось бы, отсортированные проблемы, чем ссылаться на них, но мои усилия при этом не сработали)

Заранее спасибо!

РЕДАКТИРОВАТЬ:

УБЕДИТЕСЬ, ЧТОБЫ СОБИРАТЬ ПРАВИЛЬНЫЕ ФАЙЛЫ ИСТОЧНИКА, НЕ СТАРЫМ, КОТОРЫМ ВЫ ЗАБЫЛИ КОПИРОВАНИЕ.

Привет @trojanfoe и @Kerrick SB, оба ответа заставили меня взглянуть на мой make-файл ипонимаю, это было некрасиво.Вот пересмотренная версия.Я все еще получаю ту же «неопределенную ссылку на деструктор», хотя:

makefile:

CXX = g++

BIN = .

LIBS = -L.

INCLUDE = -I. 

CXXFLAGS = -pipe # -O6

LDFLAGS = -lm

GeomTest_OBJS       =   sasa_transformMatrix.o SASAGeometry.o geomSetup.o

SASAGeometry.o      :   SASAGeometry.cpp SASAGeometry.h 

sasa_transformMatrix.o  :   sasa_transformMatrix.cpp sasa_transformMatrix.h 

geomSetup.o         :   geomSetup.cpp

geomTest                : $(GeomTest_OBJS)
                    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+

clean           : \rm *.o *~ p1

error:

geomSetup.o: In function `main':
geomSetup.cpp:(.text+0x5ab): undefined reference to `SASAGeometry::~SASAGeometry()'
geomSetup.cpp:(.text+0x5cd): undefined reference to `SASAGeometry::~SASAGeometry()'
collect2: ld returned 1 exit status
make: *** [geomTest] Error 1

Почему компоновщик будет жаловаться надеструктор, а не конструктор или любые другие методы / функции в классе?

Еще раз спасибо!

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Ваш исполняемый файл вывода и ваш объектный файл geomTest.o имеют одинаковые имена! Это может привести к неприятностям, когда компоновщик перезаписывает объектный файл.

Измените его на $(CXX) -o geomTest ... или лучше на $(CXX) $@ ..., чтобы избежать подобных проблем в будущем.

Фактически, вы вообще неправильно используете команду компоновщика: вы просто хотите иметь опцию one single -o, и объекты перечисляются напрямую, без флагов:

g++ -o myprog main.o foo.o bar.o

В Makefile сделайте себе одолжение и используйте магические макросы:

myprog: main.o foo.o bar.o
        $(CXX) $(LDFLAGS) -o $@ $+ $(LIBRARIES)

Здесь -o $@ соответствует имени цели, то есть -o myprog, а $+ соответствует всем зависимым именам, т.е. main.o foo.o bar.o.

Основная идея использования переменных заключается в том, что вы никогда не должны говорить одно и то же более одного раза, если можете помочь. Таким образом, вы можете иметь myprog: $(MyObjects) как правило, но затем использовать $+ в командной строке, чтобы избежать повторения MyObjects. Это улучшает местность и ремонтопригодность.

2 голосов
/ 25 октября 2011

Мне кажется, что -o SASAGeometry.o в цели geomTest весьма подозрительно - вы перезаписываете один из объектов зависимостей (фактически обе зависимости).

Попробуйте это:

geomTest    : $(GeomTest_OBJS)
            $(CXX)  $(CXXFLAGS)  $(LDFLAGS) -o $@ $(GemoTest_OBJS) $(LIBS)

(обратите внимание, что $LDFLAGS - это обычная переменная, в которой хранятся флаги компоновщика, а не $LFLAGS, которая используется с инструментом lex).

...