Netbeans 10: ошибка: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова) - PullRequest
0 голосов
/ 15 октября 2018

Я новичок в C ++.Я схожу с ума по этой проблеме (я проверял и пробовал другие решения от людей, имеющих эту самую проблему с переполнением стека, но по какой-то причине я не могу решить ее).У меня есть следующие файлы -

stdafx.h

#ifndef STDAFX_H
#define STDAFX_

#endif /* STDAFX_H */

#pragma once

#include <iostream>
#include <cstdlib>
#include <cmath>

geometry.h

#ifndef GEOMETRY_H
#define GEOMETRY_H



#endif /* GEOMETRY_H */

#pragma once

double PI = 3.1415;

class Circle    {
public:
    double radius;
    double area() const;
    double circumference() const;
};

geometry.cpp

#include "geometry.h"

double Circle::area() const {
    return PI*radius*radius;
}

double Circle::circumference() const {
    return 2*PI*radius;
}

main.cpp

#include "stdafx.h"
#include "geometry.h"

using namespace std;

int main() {
    Circle c;
    c.radius = 2.0;
    cout << c.area();
    cout << c.circumference();
}

Я получаю ошибку -

> cd '/Users/arpanganguli/NetBeansProjects/Chapter8'
/usr/bin/make -f Makefile CONF=Debug
"/Library/Developer/CommandLineTools/usr/bin/make" -f nbproject/Makefile- 
Debug.mk QMAKE= SUBPROJECTS= .build-conf
"/Library/Developer/CommandLineTools/usr/bin/make"  -f nbproject/Makefile- 
Debug.mk dist/Debug/GNU-MacOSX/chapter8
mkdir -p dist/Debug/GNU-MacOSX
g++     -o dist/Debug/GNU-MacOSX/chapter8 build/Debug/GNU-MacOSX/geometry.o 
build/Debug/GNU-MacOSX/main.o 
duplicate symbol _PI in:
build/Debug/GNU-MacOSX/geometry.o
build/Debug/GNU-MacOSX/main.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see 
invocation)
make[2]: *** [dist/Debug/GNU-MacOSX/chapter8] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

Я не понимаю, что я делаю не так?Я использую Netbeans 10 на MacOS (если эта информация полезна).Я верю, что ошибка пытается сказать мне, что я связываю одни и те же файлы дважды, но если мне не нравятся main.cpp и geometry.cpp через geometry.h, я не смогу вызвать функцию в main.cpp.Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 15 октября 2018

Вы не можете определить переменную более одного раза.Вы включаете файл заголовка и в geometry.cpp, и в main.cpp, что приводит к его двойному определению.Как я уже упоминал в комментариях, вы можете переместить определение в файл geometry.cpp.Если вы хотите использовать его в каком-то другом файле, объявите его в geometry.h как extern double PI; и все же определите его в geometry.cpp.

geometry.h

#pragma once

// Tell the compiler "this var exists, but in another file"
extern double PI;

class Circle    {
public:
    double radius;
    double area() const;
    double circumference() const;
};

geometry.cpp

#include "geometry.h"

// It is defined here
double PI = 3.1415;

double Circle::area() const {
    return PI*radius*radius;
}

double Circle::circumference() const {
    return 2*PI*radius;
}

Предполагая, что значение Pi никогда не меняется, вы также можете сделать его константной переменной.Затем вы можете вернуться к его определению в "geometry.h"

const double PI = 3.1415;

Или, чтобы вообще избежать глобальной переменной, сделать ее членом класса Circle:

class Circle    {
public:
    const double PI = 3.1415;
    double radius;
    double area() const;
    double circumference() const;
};

Здесь есть нечто большее, чем я могу охватить здесь.Здесь перечислено много хороших книг по С ++: Полное руководство и список книг по С ++

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...