LINUX.ORG.RU

модули


0

0

Что то я не понимаю.

Есть у меня программа. Я разбил ее на модули. Что бы в программе было проще разобраться, у каждого модуля есть заголовочный файл. В нем описываются классы, структуры, заголовки функций. В самом модуле реализация - методы и определение функций.

Допустим у меня в модуле несколько функций. Тогда все это должно выглядеть следующим образом:

bash-2.05b$ cat ./test.cpp
#include <stdio.h>
#include "test.h"

void func1(int i){
//something
}

bool func2(int *i){
//something
return true;
}

bash-2.05b$ cat ./test.h
void func1(int i);
bool func2(int *i);

bash-2.05b$ cat ./main.cpp
#include "test.h"

int main(){
int *i = 0;

func1(0);
func2(i);

return 0;
}

Только вот при компиляции вылезает совсем что-то страшное:

bash-2.05b$ gcc ./main.cpp
/tmp/ccaoku0u.o(.text+0x1f): In function `main':
: undefined reference to `func1(int)'
/tmp/ccaoku0u.o(.text+0x2a): In function `main':
: undefined reference to `func2(int*)'
/tmp/ccaoku0u.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

Посоветуйте статью, рассказывающую о структурах программ, этих подходах...
Синтаксис C и C++ я знаю, но таких элементарных вещей нет...

anonymous

Статью не подскажу... 
только если 
info gcc
info make
:)

а компилировать это надо так:
bash-2.05b$ g++ main.cpp test.cpp

или так
bash-2.05b$ g++ -c test.cpp
bash-2.05b$ g++ -c main.cpp
bash-2.05b$ g++ main.o test.o

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

>gcc -o main main.cc test.cc

извиняюсь, правильнее :

g++ -o main main.cc test.cc

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

может проще будет makefile состряпать типа такого:

CXX = g++
CXXFLAGS =
SRCS = main.cpp test.cpp
OBJS = $(SRCS:.cpp=.o)

all: foo

foo: $(OBJS)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

no1sm ★★
()

потом ещё посмотрите доки по make - сильно облегчит жизнь
для начала, безвозмездно ;-) - простенький Makefile 
---
# стандартые утилиты
CC=gcc
CXX=g++

# флаги для них
CFLAGS=-O3
CXXFLAGS=$(CFLAGS)

# первая цель - то что собирается если запустить make без аргументов
all : main 

# из каких объектников собрать цель
main : test.o main.o 

# из каких исходников собирать каждый объектник (модуль)
test.o : test.cpp

main.o : main.cpp

# цели, не образующие файлов
.PHONY : clean touch

# подправить метку времени для исходных файлов 
# (бывает нужно чотбы гарантированно пересобрать всё)
# чтобы исполнить надо запутить make touch
touch :
   touch -c *.cpp *.h

# удалить все результаты компиляции
clean :
   rm -f *.o main
--
чтобы скомпилять и собрать Вашу программу из модулей достаточно будет одного вызова make.
Думаю, что на первых порах Вам вполне хватит такого Makefile, 
а потом уже и сами разберётесь и будете новичков учить ;-)

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

Можно ещё добавить автоматическое отслеживание зависимостей                                             , нужна прога makedepend из иксов, ну и добавить цель depend в all:

DEPS    = $(SRCS:.cpp=.d)                                                                                            
                                                                                                                     
.PHONY: depend                                                                                                                    depend: $(DEPS)                                                                                                      
                                                                                                                     
.SUFFIXES: .d .cpp                  
.cpp.d:                                                                                                               
      makedepend -f- -- $(CXXFLAGS) -- $< > $@ 2> /dev/null

ifneq "$(wildcard *.d)" ""                                                      
    include $(wildcard *.d)                                                     
endif

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

no1asm : будь проще.. человек и так со временем со всем разберется, а то щас напугаем всякими сложностям, да неожиданностями, решит что *nix плохо ;-)

P.S. ваши 5 попыток написать одно сообщение - это круто ;-)

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

это уж точно, в результате всё равно уползла половина вправо)

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

`gcc -MM -MG` вполне проканывает вместо makedepend-а

anonymous
()

Во первых тебе нужно делать мэйкфайл (так принято), во вторых как уже говорилось компилить каждый модуль в объект а потом компилить main.cc в прогу с подаными ему объектами.
Во вторых в заголовочных файлах следует в начале писать:

/* Begining of the MODULE file */
#ifndef __MODNAME_H_
#defined __MODNAME_H_

Потом код,
// CODE CODE CODE

А в конце:
#endif
/* End of file */

... Это тоже нужно воимя избежания ошибок компиляции.

Удачи.

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