Назад | Перейти на главную страницу

не может заставить distcc работать через сеть

Я пытаюсь использовать distcc для компиляции программ C / C ++ с использованием более чем одного компьютера по сети. На данный момент я использую только два компьютера, но я намерен использовать больше, когда он будет работать с этими двумя.

Я использую Gentoo, установил distcc на обеих машинах командой:

[пользователь @ pc ~] $ emerge distcc

IP-адреса / имена машин, которые я использую: 10.0.0.47 (qc7) и 10.0.0.46 (qc6). эти компьютеры идентичны, я установил на них одинаковые пакеты и настроил distcc так же.

Я установил имена машин с distcc-config:

[пользователь @ pc ~] $ distcc-config --set-hosts "qc6 qc7"

и я изменил файл /etc/conf.d/distcc чтобы обе машины:

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

после этого я просто запустил сервис:

[пользователь @ pc ~] $ /etc/init.d/distccd start

Я попытался скомпилировать простую программу на C ++ с одним классом (.h и .cc) и файл с main функция. код ниже:

person.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 = -Стена

person: main.o person.o
$ (CC) $ (CFLAGS) -o человек 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

если я бегу только:

[пользователь @ pc ~] $ make

без использования distcc, код компилируется нормально. но если я бегу:

[user @ pc ~] $ make CC = distcc

этап связывания дает мне ошибку. вот результат:

distcc -Wall -c main.cc
distcc -Wall -c person.cc
distcc -Wall -o person main.o person.o
main.o: В функции `глобальные конструкторы с ключом к main ':
main.cc:(.text+0xa): неопределенная ссылка на `std :: ios_base :: Init :: Init () '
main.cc:(.text+0x19): неопределенная ссылка на `std :: ios_base :: Init :: ~ Init () '
main.o: В функции `main ':
main.cc:(.text+0x5a): неопределенная ссылка на `std :: basic_string, std :: allocator> :: basic_string (char const *, std :: allocator const &) '
main.cc:(.text+0x80): неопределенная ссылка на `std :: basic_string, std :: allocator> :: _ Rep :: _ S_empty_rep_storage '
main.cc:(.text+0xa4): неопределенная ссылка на `std :: basic_string, std :: allocator> :: basic_string (std :: basic_string, std :: allocator> const &) '
main.cc:(.text+0xb3): неопределенная ссылка на `std :: cout '
main.cc:(.text+0xb8): неопределенная ссылка на `std :: basic_ostream> & std :: __ ostream_insert> (std :: basic_ostream> &, char const *, long) '
main.cc:(.text+0xc5): неопределенная ссылка на `std :: cout '
main.cc:(.text+0xce): неопределенная ссылка на `std :: basic_ostream> & std :: __ ostream_insert> (std :: basic_ostream> &, char const *, long) '
main.cc:(.text+0xe3): неопределенная ссылка на `std :: basic_ostream> & std :: __ ostream_insert> (std :: basic_ostream> &, char const *, long) '
main.cc:(.text+0xed): неопределенная ссылка на `std :: basic_ostream> :: operator << (int) '
main.cc:(.text+0x102): неопределенная ссылка на `std :: basic_ostream> & std :: __ ostream_insert> (std :: basic_ostream> &, char const *, long) '
main.cc:(.text+0x182): неопределенная ссылка на `std :: basic_ostream> :: put (char) '
main.cc:(.text+0x18a): неопределенная ссылка на `std :: basic_ostream> :: flush () '
main.cc:(.text+0x1d9): неопределенная ссылка на `std :: __ throw_bad_cast () '
main.cc:(.text+0x208): неопределенная ссылка на `std :: basic_string, std :: allocator> :: _ Rep :: _ M_destroy (std :: allocator const &) '
main.cc:(.text+0x243): неопределенная ссылка на `std :: basic_string, std :: allocator> :: _ Rep :: _ M_destroy (std :: allocator const &) '
main.cc:(.text+0x277): неопределенная ссылка на `std :: basic_string, std :: allocator> :: _ Rep :: _ M_destroy (std :: allocator const &) '
main.cc:(.text+0x292): неопределенная ссылка на `std :: basic_string, std :: allocator> :: ~ basic_string () '
main.cc:(.text+0x2af): неопределенная ссылка на `std :: basic_string, std :: allocator> :: ~ basic_string () '
main.cc:(.text+0x2bc): неопределенная ссылка на `std :: basic_string, std :: allocator> :: ~ basic_string () '
main.o :(. eh_frame + 0x13): неопределенная ссылка на `__gxx_personality_v0 '
person.o: В функции `Person :: Person (std :: basic_string, std :: allocator>, int) ':
person.cc:(.text+0x15): неопределенная ссылка на `std :: basic_string, std :: allocator> :: basic_string (std :: basic_string, std :: allocator> const &) '
person.o: В функции `Person :: Person (std :: basic_string, std :: allocator>, int) ':
person.cc:(.text+0x45): неопределенная ссылка на `std :: basic_string, std :: allocator> :: basic_string (std :: basic_string, std :: allocator> const &) '
person.o :(. eh_frame + 0x12): неопределенная ссылка на `__gxx_personality_v0 '
collect2: ld вернул 1 статус выхода
distcc [26001] ОШИБКА: сбой компиляции (null) на локальном хосте
make: *** [человек] Ошибка 1

[выделенная жирным шрифтом строка - единственная, имеющая отношение к distcc, все остальные - вывод компилятора.]

это как если бы distcc не смог найти базовые библиотеки. что мне делать, чтобы сделать distcc скомпилировать эту программу, используя несколько компьютеров в сети? это какая-то конфигурация, которую я пропустил?

Старайтесь не использовать distcc на этапе связывания. То есть использовать

LD = g ++

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

в вашем Makefile.

Может быть, это глупый вопрос, но ... вы уверены, что разместили необходимые заголовки и библиотеки на обеих машинах?