2012-06-22 7 views
2

Я новичок в программировании на C++ и знаю основы C++. Я пытаюсь связать три файла, но я не могу получить выход. Я изучаю книгу кулинарной книги C++ прямо сейчасСвязывание нескольких объектных файлов в C++, но без вывода

Предположим, у нас есть файлы a.hpp a.cpp, b.hpp b.cpp, c .hpp c.cpp со следующим кодом:

a.hpp

#ifndef A_HPP_INCLUDED 
#define A_HPP_INCLUDED 
void a(); 
#endif 

a.cpp

#include "a.hpp" 
#include <iostream> 
void a() 
{ 
    std::cout<<"a \n "; 
} 

b.hpp

#ifndef B_HPP_INCLUDED 
#define B_HPP_INCLUDED 
void b(); 
#endif 

b.cpp

#include "b.hpp" 
#include <iostream> 
void b() 
{ 
    std::cout<<"b \n "; 
} 

c.hpp

#ifndef C_HPP_INCLUDED 
#define C_HPP_INCLUDED 
void c(); 
#endif 

c.cpp

#include "a.hpp" 
#include "b.hpp" 
#include "c.hpp" 
void c() 
{ 
    a(); 
    b(); 

} 

int main() 
{ 
    c(); 
    return 0; 
} 

Я создал все файлы в одной папке и команды я использовал, чтобы собрать и связать их в

$:g++ -c -Wall a.cpp b.cpp c.cpp 
$:g++ -o -Wall a.o b.o c.o 
$:./a.out 

Я ожидал Outout

a 
b 

, но не было никакого вывода на всех . Попросите всех вас помочь мне в этом.

+0

В первом абзаце упоминаются 'ab.h' и' ab.c', но они не используются. Правильны ли команды сборки? Игнорируя эти два файла, все выглядит правильно и должно работать так, как вы ожидаете. – wallyk

ответ

3

Удалите -o из командной строки g++.

В настоящее время вы сообщаете g++, чтобы связать ваши объекты вместе с файлом под названием -Wall. Поэтому альтернативным решением было бы позвонить ./-Wall вместо ./a.out.

Из-за пробелов в ваших строках (" \n " против "\n"), вы все равно не получите точный ожидаемый результат. Кроме того, вы, вероятно, хотите заменить:

std::cout << "something \n"; 

с

std::cout << "something" << std::endl; 

, если вы хотите, чтобы данные на экране сразу (промывка). См. Также C++: “std::endl” vs “\n”.

+0

Как ни странно, верхние ответы в связанном вопросе противоречат тому, что вы заявляете ... – stefaanv

+0

Можете ли вы добавить цитату? Из того, что я читал, они не противоречат, по крайней мере, принятого человека нет. Он просто говорит, что если вы хотите очистить свой вывод, используйте 'std :: endl'. В командной строке я обычно делаю это, чтобы избежать потери (отладки) данных в случае сбоя или чего-то еще. –

+0

Это противоречит вашей претензии, что 'endl' помогает переносимости. Это утверждение портит в противном случае хороший ответ. –

0
$:g++ a.o b.o c.o -o your_output_program_name -Wall 

попробуйте использовать эту команду. Вы обязательно получите все, чтобы правильно работать

Смежные вопросы