无法使 distcc 通过网络工作

无法使 distcc 通过网络工作

我正在尝试使用分布式通过网络使用多台计算机编译 C/C++ 程序。目前我只使用两台计算机,但我打算在两台计算机上同时运行后使用更多计算机。

我正在使用 Gentoo,我distcc在两台机器上使用以下命令进行安装:

[用户@pc ~]$ 出现 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} --允许 10.0.0.46 --允许 10.0.0.47"
...

之后,我刚刚启动了服务:

[用户@pc ~]$ /etc/init.d/distccd 启动

我尝试编译一个简单的 C++ 程序,其中包含一个类(.h.cc)和一个带有函数的文件main。代码如下:

人.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; }
};

人人网

#include "person.h"

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

主目录

#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=-墙

人:main.o 人.o
$(CC) $(CFLAGS) -o 人 main.o 人.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,代码就可以编译。但如果我运行:

[用户@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:*** [person] 错误 1

[粗体行是唯一与相关的行distcc,其他行都是编译器输出。]

好像distcc找不到基本库。我该怎么做才能distcc使用网络上的多台计算机编译该程序?是我错过了一些配置吗?

答案1

尝试在链接阶段不使用 distcc。也就是说,使用

LD=g++

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

在你的 Makefile 中。

答案2

也许这是一个愚蠢的问题,但是......你确定在两台机器上都放置了所需的标题和库吗?

相关内容