【问题标题】:Another one: Undefined symbols for architecture x86_64: [duplicate]另一个:架构x86_64的未定义符号:[重复]
【发布时间】:2016-06-27 18:13:53
【问题描述】:

我一直在浏览所有不同的“未定义符号”帖子,但我仍然无法让我的特殊情况发挥作用。我最初在编译更大的项目时收到了未定义的错误,但即使我将它本地化到特定的类,我仍然会收到错误。我对 C++ 很陌生,我觉得关于编译器和链接器如何在 C++ 中工作有一些更大的概念。我不确定要包含多少代码,但如果我包含的内容过多,请告诉我。所以现在是代码:

我的头文件

#ifndef FCFS_H
#define FCFS_H

#include <vector>
#include <fstream>
#include <iostream>

#include <Process.h>

using namespace std;

class FCFS{

public:
        /* Simple Constructor */

        FCFS(){
                totWaitTime = 0;
                totTurnAround = 0;
                timeElapsed = 0;
                vectorSize = 0;
        }

        /* Simple Accessors */
        inline int returnTotWT() const {return totWaitTime;}
        inline int returnTotTAT() const {return totTurnAround;}
        inline int returnTime() const {return timeElapsed;}
        inline int returnVecSize() const {return vectorSize;}

        /* Mutators */
        void buildMatrix(ifstream& myinfile);
        Process buildProcess(string line);
        vector<string>parser (const string& s, const string& w);

        bool runSchedule(string myinfile, string myoutfile);

private:
        int totWaitTime;
        int totTurnAround;
        int timeElapsed;
        int vectorSize;
        vector <Process> arrivedProc;


};

#endif // FCFS_H_INCLUDE

我的 .cpp 文件:

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <iomanip>
    #include <iterator>
    #include <algorithm>
    #include <stdlib.h>
    #include <sstream>

    #include <Process.h>
    #include "FCFS.h"

    using namespace std;

    void FCFS::buildMatrix(ifstream& myinfile){
            string line;
            while(getline(myinfile, line)){
                    Process newProc = buildProcess(line);
                    arrivedProc.push_back(newProc);
            }

            sort(arrivedProc.begin(), arrivedProc.end(), Process::compareAT);
            vectorSize = arrivedProc.size();
    }

    vector<string> FCFS::parser (const string& s, const string& w){
            string temp{s};
            for (char& ch : temp){
                    for (char white : w){
                            if (ch == white) ch = ' ';
                    }
            }

            vector <string> substrings;
            stringstream ss;
            ss << temp;
            for (string buffer; ss >> buffer;){
                    substrings.push_back(buffer);
            }

            return substrings;
    }

    Process FCFS::buildProcess(string line){
            vector<string> procEl = parser(line, ",-");
            Process newProc(stoi(procEl[0]), stoi(procEl[1]), 

stoi(procEl[2]), stoi(procEl[3]), stoi(procEl[4]), stoi(procEl[5]));
                return newProc;
        }
    bool FCFS::runSchedule(string myin, string myout){
...just implempentation that I don't think is the problem...
    }

int main(){
        FCFS sched;
        string in = "Sample_Input1.txt";
        string out = "output.txt";

        sched.runSchedule(in, out);
}

我的错误:

    Ethans-MacBook-Pro:HW4 lozae$ g++ -g -Wall -std=c++11 -I. FCFS.cpp
Undefined symbols for architecture x86_64:
  "Process::setWT(double)", referenced from:
      FCFS::runSchedule(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in FCFS-53eb8f.o
  "Process::setTAT(double)", referenced from:
      FCFS::runSchedule(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in FCFS-53eb8f.o
  "Process::print(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const", referenced from:
      FCFS::runSchedule(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in FCFS-53eb8f.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

感谢您的帮助!

【问题讨论】:

  • 你的链接器命令行是什么?
  • 什么是Process?如果是您写的,请检查是否有错字。如果是外部库,链接需要的东西。
  • "...只是我认为不是问题的实现..." 这正是问题所在。编辑您的帖子,并提供minimal reproducible example。您认为“引用自:FCFS::runSchedule”在说什么?编译器会告诉你问题出在哪里,并且不知何故你决定这不是问题所在。奇怪。

标签: c++


【解决方案1】:

编译 Process 的代码时出现问题,您没有包含该代码,或者您没有告诉 g++ 在哪里可以找到要链接的库。

“未定义符号”类型错误意味着链接器找不到符号的编译代码。 (在本例中为 Process::setWTProcess::setTATProcess::print。)您需要告诉 g++ 在哪里可以找到要链接的库。

http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

代码如何使用 g++ 编译的简要概述是:1) g++ 将代码编译目标文件和/或 , 2) ld(链接器)链接目标文件到可执行文件中。

这是简化的,但重要的是要知道 链接器 需要知道哪些 目标文件(已编译的代码,但不是可执行文件)将链接在一起以创建可执行文件文件。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2012-07-20
  • 1970-01-01
相关资源
最近更新 更多