LINUX.ORG.RU

с++ ЛОМО


0

0

.obj/func.o(.text+0x0): In function `loadIt()':
: multiple definition of `loadIt()'
.obj/main.o(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [mycomp] Ошибка 1

Такую штуку выдает компилер. Идея такова:
-Создал проект в QT-Designer
-Добавил модуль(в нем ф-я loadIt() один раз объявлена)
-ОДИН РАЗ(только в этом месте) его подключил

В компилер говорит обратное! Я даже поиском искал вхождения "include "func.cpp"" - один файл(main.cpp)

Я уж думаю что make написан криво... Делал я его qmake'ом и синтаксис не совсем понимаю... 

#############################################################################
# Makefile for building: mycomp
# Generated by qmake (1.06c) (Qt 3.2.3) on: Fri Oct 29 20:49:46 2004
# Project:  mycomp.pro
# Template: app
# Command: $(QMAKE) -o Makefile mycomp.pro
#############################################################################

####### Compiler, tools and options

CC       = gcc
CXX      = g++
LEX      = flex
YACC     = yacc
CFLAGS   = -pipe -Wall -W -O2 -fomit-frame-pointer -pipe -march=i586 -mcpu=pentiumpro  -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT
CXXFLAGS = -pipe -Wall -W -O2 -fomit-frame-pointer -pipe -march=i586 -mcpu=pentiumpro  -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT
LEXFLAGS = 
YACCFLAGS= -d
INCPATH  = -I/usr/lib/qt3/mkspecs/default -I. -I$(QTDIR)/include -I.ui/ -I. -I.moc/
LINK     = g++
LFLAGS   = 
LIBS     = $(SUBLIBS) -L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
AR       = ar cqs
RANLIB   = 
MOC      = $(QTDIR)/bin/moc
UIC      = $(QTDIR)/bin/uic
QMAKE    = qmake
TAR      = tar -cf
GZIP     = gzip -9f
COPY     = cp -f
COPY_FILE= $(COPY)
COPY_DIR = $(COPY) -r
DEL_FILE = rm -f
SYMLINK  = ln -sf
DEL_DIR  = rmdir
MOVE     = mv -f
CHK_DIR_EXISTS= test -d
MKDIR    = mkdir -p

####### Output directory

OBJECTS_DIR = .obj/

####### Files

HEADERS = 
SOURCES = main.cpp \
		func.cpp
OBJECTS = .obj/main.o \
		.obj/func.o \
		.obj/first_f.o \
		.obj/qmake_image_collection.o
FORMS = first_f.ui
UICDECLS = .ui/first_f.h
UICIMPLS = .ui/first_f.cpp
SRCMOC   = .moc/moc_first_f.cpp
OBJMOC = .obj/moc_first_f.o
DIST	   = mycomp.pro
QMAKE_TARGET = mycomp
DESTDIR  = 
TARGET   = mycomp

first: all
####### Implicit rules

.SUFFIXES: .c .o .cpp .cc .cxx .C

.cpp.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cc.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.cxx.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.C.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

.c.o:
	$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<

####### Build rules

all: Makefile $(TARGET)

$(TARGET):  $(UICDECLS) $(OBJECTS) $(OBJMOC)  
	$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) $(OBJCOMP)

mocables: $(SRCMOC)
uicables: $(UICDECLS) $(UICIMPLS)

$(MOC): 
	( cd $(QTDIR)/src/moc ; $(MAKE) )

Makefile: mycomp.pro  /usr/lib/qt3/mkspecs/default/qmake.conf /usr/lib/qt3/lib/libqt-mt.prl
	$(QMAKE) -o Makefile mycomp.pro
qmake: 
	@$(QMAKE) -o Makefile mycomp.pro

dist: 
	@mkdir -p .obj/mycomp && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .obj/mycomp/ && $(COPY_FILE) --parents images/filenew images/fileopen images/filesave images/print images/undo images/redo images/editcut images/editcopy images/editpaste images/searchfind .obj/mycomp/ && $(COPY_FILE) --parents first_f.ui.h .obj/mycomp/ && ( cd `dirname .obj/mycomp` && $(TAR) mycomp.tar mycomp && $(GZIP) mycomp.tar ) && $(MOVE) `dirname .obj/mycomp`/mycomp.tar.gz . && $(DEL_FILE) -r .obj/mycomp

mocclean:
	-$(DEL_FILE) $(OBJMOC)
	-$(DEL_FILE) $(SRCMOC)


install: all  

uninstall:  

Не у кого ни каких идей нету?
anonymous

Не значительную часть пришлось удалить(не влазило все)

anonymous
()

На кой ляд ты свой модуль через #include подцепил? Таким способом подключаются _объявления_ функций, а не определения. У тебя 2 файла в проекте. В обоих определена эта функция. Либо убери второй файл из проекта, либо не включай его через #include.

nobody ★★
()

В заголовочном файле обычно пишут:
myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
...
#endif
, что позволяет избежать подобной ошибки переопределения при
многократном включении.

Tsahes
()
Ответ на: комментарий от Tsahes

Не, у парня другая проблема:


//--------------------- func.cc
#include <stdio.h>
void func()
  {
  puts("Hello world!");
  }
//--------------------- end of func


//--------------------- main.cc
#include "func.cc"
int main()
  {
  func();
  return 0;
  }
//--------------------- end of main


g++ -c main.cc
g++ -c func.cc
g++ -o prg main.o func.o    #ошибка: func определена дважды


Следует либо не компилить func.cc (и не линковать его -- выкинуть
вообще из Makefile, оставив только как зависимость для main), либо
убрать из main.cc вот эту строку:

#include "func.cc"

nobody ★★
()
Ответ на: комментарий от nobody

Спасибо. Последний совет помог. У меня ж один файл .cpp Заголовочного нету.

Но появилось новая проблема: в функции func() добавляю в динамическую память кое-какую инфу, и кидаю указатель в main. Но там при попытке обратиться к этой переменной выдается segmentation fault!

Переменные точно создаются (new)

Как линух подниму, напечатаю код здесь...
(я щас в маздае)

anonymous
()
Ответ на: комментарий от anonymous

Купи себе хорошую книжку по C. Прочитай о том, как компилятор и линкер работают. Все твои проблемы полечит разом.

eXOR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.