não pode fazer o distcc funcionar através da rede

1

Estou tentando usar distcc para compilar programas C / C ++ usando mais de um computador pela rede. Estou usando apenas dois computadores por enquanto, mas pretendo usar mais quando funciona com esses dois.

Estou usando o Gentoo, instalei distcc em ambas as máquinas com o comando:

[user@pc ~]$ emerge distcc

os IPs / nomes das máquinas que estou usando são: 10.0.0.47 (qc7) e 10.0.0.46 (qc6). esses computadores são idênticos, eu instalei exatamente os mesmos pacotes em todos eles, e eu configurei distcc da mesma maneira.

Eu defino os nomes das máquinas com distcc-config :

[user@pc ~]$ distcc-config --set-hosts "qc6 qc7"

e eu mudei o arquivo /etc/conf.d/distcc para permitir as duas máquinas:

...
DISTCCD_OPTS="${DISTCCD_OPTS} --allow 10.0.0.46 --allow 10.0.0.47"
...

depois disso, acabei de iniciar o serviço:

[user@pc ~]$ /etc/init.d/distccd start

Eu tentei compilar um programa C ++ simples, com uma classe ( .h e .cc ) e um arquivo com a função main . o código está abaixo:

pessoa.h

#include <string>

using namespace std;

class Person {
  private:
    string name_;
    int age_;

  public:
    Person(string, int);

    string name() const { return name_; }
    int age() const { return age_; }

    void set_name(string name) { name_ = name; }
    void set_age(int age) { age_ = age; }
};

person.cc

#include "person.h"

Person::Person(string name, int age)
    : name_(name), age_(age) {}

main.cc

#include <iostream>
#include "person.h"

using namespace std;

int main() {
    Person cd1("Cristian",22);
    cout << "hi, my name is " << cd1.name() << " and I'm " << cd1.age() << " years old." << endl;
    return 0;
}

Makefile

CC=g++
CFLAGS=-Wall

person: main.o person.o
$(CC) $(CFLAGS) -o person main.o person.o

person.o: person.cc person.h
$(CC) $(CFLAGS) -c person.cc

main.o: main.cc person.h
$(CC) $(CFLAGS) -c main.cc

se eu correr apenas:

[user@pc ~]$ make

sem usar distcc , o código compila bem. mas se eu correr:

[user@pc ~]$ make CC=distcc

a fase de ligação me dá um erro. aqui está a saída:

distcc -Wall -c main.cc
distcc -Wall -c person.cc
distcc -Wall -o person main.o person.o
main.o: In function 'global constructors keyed to main':
main.cc:(.text+0xa): undefined reference to 'std::ios_base::Init::Init()'
main.cc:(.text+0x19): undefined reference to 'std::ios_base::Init::~Init()'
main.o: In function 'main':
main.cc:(.text+0x5a): undefined reference to 'std::basic_string, std::allocator >::basic_string(char const*, std::allocator const&)'
main.cc:(.text+0x80): undefined reference to 'std::basic_string, std::allocator >::_Rep::_S_empty_rep_storage'
main.cc:(.text+0xa4): undefined reference to 'std::basic_string, std::allocator >::basic_string(std::basic_string, std::allocator > const&)'
main.cc:(.text+0xb3): undefined reference to 'std::cout'
main.cc:(.text+0xb8): undefined reference to 'std::basic_ostream >& std::__ostream_insert >(std::basic_ostream >&, char const*, long)'
main.cc:(.text+0xc5): undefined reference to 'std::cout'
main.cc:(.text+0xce): undefined reference to 'std::basic_ostream >& std::__ostream_insert >(std::basic_ostream >&, char const*, long)'
main.cc:(.text+0xe3): undefined reference to 'std::basic_ostream >& std::__ostream_insert >(std::basic_ostream >&, char const*, long)'
main.cc:(.text+0xed): undefined reference to 'std::basic_ostream >::operator<<(int)'
main.cc:(.text+0x102): undefined reference to 'std::basic_ostream >& std::__ostream_insert >(std::basic_ostream >&, char const*, long)'
main.cc:(.text+0x182): undefined reference to 'std::basic_ostream >::put(char)'
main.cc:(.text+0x18a): undefined reference to 'std::basic_ostream >::flush()'
main.cc:(.text+0x1d9): undefined reference to 'std::__throw_bad_cast()'
main.cc:(.text+0x208): undefined reference to 'std::basic_string, std::allocator >::_Rep::_M_destroy(std::allocator const&)'
main.cc:(.text+0x243): undefined reference to 'std::basic_string, std::allocator >::_Rep::_M_destroy(std::allocator const&)'
main.cc:(.text+0x277): undefined reference to 'std::basic_string, std::allocator >::_Rep::_M_destroy(std::allocator const&)'
main.cc:(.text+0x292): undefined reference to 'std::basic_string, std::allocator >::~basic_string()'
main.cc:(.text+0x2af): undefined reference to 'std::basic_string, std::allocator >::~basic_string()'
main.cc:(.text+0x2bc): undefined reference to 'std::basic_string, std::allocator >::~basic_string()'
main.o:(.eh_frame+0x13): undefined reference to '__gxx_personality_v0'
person.o: In function 'Person::Person(std::basic_string, std::allocator >, int)':
person.cc:(.text+0x15): undefined reference to 'std::basic_string, std::allocator >::basic_string(std::basic_string, std::allocator > const&)'
person.o: In function 'Person::Person(std::basic_string, std::allocator >, int)':
person.cc:(.text+0x45): undefined reference to 'std::basic_string, std::allocator >::basic_string(std::basic_string, std::allocator > const&)'
person.o:(.eh_frame+0x12): undefined reference to '__gxx_personality_v0'
collect2: ld returned 1 exit status
distcc[26001] ERROR: compile (null) on localhost failed
make: *** [person] Error 1

[ a linha em negrito é a única relevante para distcc , todas as outras são a saída do compilador. ]

é como se distcc não conseguisse encontrar as bibliotecas básicas. O que devo fazer para tornar o distcc compilar este programa usando vários computadores na rede? é alguma configuração que eu perdi?

    
por cd1 03.07.2009 / 19:58

2 respostas

1

Tente não usar o distcc para a fase de link. Ou seja, use

LD = g ++

person: main.o person.o
$(LD) $(LDFLAGS) -o person main.o person.o

no seu Makefile.

    
por 27.10.2009 / 13:22
0

Talvez essa seja uma pergunta boba, mas ... você tem certeza de colocar os cabeçalhos e bibliotecas necessários nas duas máquinas?

    
por 07.07.2009 / 06:44