c++:使用 g++ 对 main 的未定义引用

c++ : Undefined reference to main using g++

提问人:iambrj 提问时间:12/11/2017 最后编辑:Ashley Millsiambrj 更新时间:9/3/2018 访问量:848

问:

我一直在通过阅读 Stephen Prata 的《c++ Primer Plus》一书来学习 c++。在第 10 章中,有一个示例,它有三个(清单 10.4 到 10.6)文件(stock10.h(包含类声明)、stock10.cpp(包含成员函数定义)和 usestok1.cpp(包含调用函数))。

当我使用命令将它们编译在一起时

g++ -o stock usestok1.cpp stock10.cpp

我收到以下错误

    /usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

文件“usestok1.cpp”从工作目录中消失。我哪里做错了?

文件包含的代码:

第一个 (stock10.h) 具有类声明。

//stock10.h
#ifndef STOCK10_H_
#define STOCK10_H_
#include <string>
class stock
{
    private:
        std::string company;
        long shares;
        double share_val;
        double total_val;
        void set_tot() {total_val = shares*share_val;}
    public:
        stock();
        stock(const std::string& co,long n=0,double pr=0);
        ~stock();
        void buy(long num,double price);
        void sell(long num,double price);
        void update(double price);
        void show();
};
#endif

第二个 (stock10.cpp) 具有类成员定义

//stock10.cpp
#include <iostream>
#include "stock10.h"
stock::stock()
{
    std::cout<<"Default constructor invoked";
    company="no name";
    shares=0;
    share_val=0.0;
    total_val=0.0;
}
stock::stock(const std::string& co,long n,double pr)
{
    std::cout<<"Consturctor using"<<co<<" called\n";
    company=co;
    if(n<0)
    {
        std::cout<<"Number of shares cannot be negative;"<<company<<" shares set to 0.\n";
        shares=0;
    }
    else shares=n;
    share_val=pr;
    set_tot();
}
stock::~stock()
{
    std::cout<<"Bye, "<<company<<"\n";
}
void stock::buy(long num,double price)
{
    if(num<0)
    {
        std::cout<<"Number of shares purchased can't be negative. Transaction is aborted.\n";
    }
    else
    {
        shares+=num;
        share_val=price;
        set_tot();
    }
}
void stock::sell(long num,double price)
{
    using std::cout;
    if(num<0)
    {
        cout<<"Number of shares sold can't be negative. "<<" Transaction is aborted.\n";
    }
    else if(num>shares)
    {
        cout<<"You can't sell any more shares. Transaction is aborted.\n";
    }
    else
    {
        shares-=num;
        share_val=price;
        set_tot();
    }
}
void stock::update(double price)
{
    share_val=price;
    set_tot();
}
void stock::show()
{
    using std::cout;
    using std::ios_base;
    using std::endl;
    ios_base::fmtflags orig=cout.setf(ios_base::fixed,ios_base::floatfield);
    std::streamsize prec=cout.precision(3);
    cout<<"Company : "<<company<<endl;
    cout<<"Shares : "<<shares<<endl;
    cout.precision(2);
    cout<<"total Worth : $"<<total_val<<endl;
    cout.setf(orig,ios_base::floatfield);
    cout.precision(prec);
}

最后一个(usestok1.cpp)具有调用函数

#include <iostream>
#include "stock10.h"
int main()
{
    {
    using std::cout;
    cout << "Using constructors to create new objects\n";
    stock stock1("NanoSmart", 12, 20.0);
    stock1.show();
    stock stock2 = stock ("Boffo Objects", 2, 2.0); // syntax 2
    stock2.show();
    cout << "Assigning stock1 to stock2:\n";
    stock2 = stock1;
    cout << "Listing stock1 and stock2:\n";
    stock1.show();  
    stock2.show();
    cout << "Using a constructor to reset an object\n";
    stock1 = stock("Nifty Foods", 10, 50.0);
    cout << "Revised stock1:\n";
    stock1.show();
    cout << "Done\n";
    }
    return 0;
}
C G++ 未定义引用

评论

1赞 Peter 12/11/2017
您提供的信息中没有任何内容可以解释您所看到的症状。可能还有其他一些信息,您认为这些信息无关紧要且未在此处发布,这是问题的真正原因。
3赞 nwp 12/11/2017
编译器说它找不到你的函数。您可能编译了错误的文件或在编辑后未保存。main
0赞 iambrj 12/11/2017
@Peter缺少信息,例如?
2赞 Justin Randall 12/11/2017
文件“usestok1.cpp”从工作目录中消失。我以前从未见过编译器删除源文件,我怀疑您的问题可能与路径有关。
0赞 Peter 12/11/2017
@iambrj - 好吧,让我们看看。命令是从命令行、脚本还是 IDE 设置执行的?编译器是否有任何错误消息或警告?(您描述的唯一错误消息来自链接器,而不是编译器)。什么环境或路径设置?什么操作系统?关键是:你是有问题的人,你几乎可以肯定地认为你正在做的一些事情,或者你的设置,与问题无关——其他人只能猜测这些事情是什么。

答: 暂无答案