Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Eclipse ld:找不到符号…;但它们确实存在…;_Eclipse_Macos_Linker_G++ - Fatal编程技术网

Eclipse ld:找不到符号…;但它们确实存在…;

Eclipse ld:找不到符号…;但它们确实存在…;,eclipse,macos,linker,g++,Eclipse,Macos,Linker,G++,我的项目最近真的出了问题——我解决了一大堆错误,然后它抛出了一个神秘的ld:symbol(s)not found错误。但是,很明显,这些符号确实存在: Undefined symbols: "Solid::~Solid()", referenced from: void std::_Destroy<Solid>(Solid*)in ui.o "Log::operator+=(std::basic_string<char, std::char_traits&l

我的项目最近真的出了问题——我解决了一大堆错误,然后它抛出了一个神秘的
ld:symbol(s)not found
错误。但是,很明显,这些符号确实存在:

Undefined symbols:
  "Solid::~Solid()", referenced from:
      void std::_Destroy<Solid>(Solid*)in ui.o
  "Log::operator+=(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
  "Log::getLog(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
  "Log::Log()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ui.o
  "Building::Building(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
  "Log::~Log()", referenced from:
      ___tcf_1 in ui.o
建筑物.h
因此,它似乎正在链接所有必要的文件。此外,(头)文件都是
#在需要的地方包括

发现问题;大纲修复程序已创建

接收、解包和编译的代码;链接器产生与您看到的错误基本相同的错误

Osiris-8 JL: make bgmath.o building.o customio.o filedaemon.o log.o main.o ui.o vsystem.o
g++    -c -o bgmath.o bgmath.cpp
g++    -c -o building.o building.cpp
g++    -c -o customio.o customio.cpp
g++    -c -o filedaemon.o filedaemon.cpp
g++    -c -o log.o log.cpp
g++    -c -o main.o main.cpp
g++    -c -o ui.o ui.cpp
g++    -c -o vsystem.o vsystem.cpp
Osiris-8 JL: g++ -o cmd *.o
Undefined symbols for architecture x86_64:
  "Building::Building(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
  "Log::operator+=(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
  "Log::getLog(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
  "Log::Log()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ui.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Osiris-8 JL:
这两个结构在标头中声明,因此不应在源中重新声明。函数定义必须以Log::作为前缀,并从“class Log{…}”大括号中删除。然后对编译错误进行例行清理,导致:


log.h
\ifndef LOG\u H_
#定义日志_
#包括
#包括
使用名称空间std;
结构日志结果{
矢量结果;
智力状态;
};
结构解析日志{
字符串结果;
智力状态;
};
类日志{
公众:
int初始化();
int初始化(字符串文本);
日志();
日志(字符串文本);
布尔初始化();
int-add(字符串文本);
int运算符+=(字符串文本);
int clearLog(bool init=true);
logResult getLog();
parsedLog getLog(字符串delim);
私人:
布尔初始化;
向量动作日志;
};
#endif/*LOG_H_*/
log.cpp
#包括“log.h”
#包括“常数h”
使用名称空间std;
int Log::initialize(){
如果(已初始化)返回已初始化;
actionLog.push_back(“***日志已初始化***”);
初始化=真;
回归成功;
}
int Log::初始化(字符串文本){
如果(已初始化)返回已初始化;
//否则。。。
初始化();
actionLog.push_back(“初始化消息:+文本”);
回归成功;
}
Log::Log(){
初始化();
}
日志::日志(字符串文本){
初始化(文本);
}
bool日志::i初始化(){
返回初始化;
}
int Log::add(字符串文本){
如果(!initialized)返回NOT_INIT;
动作日志。推回(文本);
回归成功;
}
int Log::operator+=(字符串文本){
返回添加(文本);
}
int Log::clearLog(bool init){
如果(!initialized)返回NOT_INIT;
//删除操作日志;
初始化=假;
if(init)返回initialize();
//否则
回归成功;
}
logResult日志::getLog(){
如果(!已初始化){
记录最终结果;
final.status=NOT_INIT;
返回最终结果;
}否则{
记录最终结果;
final.result=actionLog;
最终状态=成功;
返回最终结果;
}
}
parsedLog日志::getLog(字符串delim){
如果(!已初始化){
parsedlogfinal;
final.status=NOT_INIT;
返回最终结果;
}否则{
parsedlogfinal;
字符串日志字符串;

for(unsigned int i;i)用于最近关于此问题的讨论。

我不知道您正在使用的软件,但我可以看到错误来自链接器。您确定它正在链接它需要的所有文件吗?“使用命名空间std;”在一个标题中是在自找麻烦,但我不知道这是否是问题所在。您用于链接软件的完整命令是什么?表面上看,似乎您没有链接Log.o对象文件(因此缺少了各种Log::函数。这使得Solid::Solid析构函数和一个稍微复杂的Building:::Building construtor也丢失了-你的代码真的定义了它们吗?@Jonathan:完整的命令是
g++-o“BuildingGenerator”./src/bgmath.o./src/building.o./src/customio.o./src/filedaemon.o./src/log.o./src/main.o./src/ui.o./src/vsystem.o
,所以它看起来像是在链接它。而且,这些文件都是
#include
d。还有其他想法吗?没有多少想法。我不想订阅FileDropper(而且你似乎必须登录/注册才能下载文件),所以我看不到你在完整的源代码中得到了什么。(请查看我的个人资料以通过电子邮件发送给我-如果尚未压缩,请进行压缩。)你是否使用
nm-Ag src/*.o | c++filt
查看了目标文件中的内容?
/*
 * log.h
 *
 *  Created on: Apr 30, 2011
 *      Author: wjc
 */

#ifndef LOG_H_
#define LOG_H_
#include <string>
using namespace std;

struct logResult {
    vector <string> result;
    int status;
};

struct parsedLog {
    string result;
    int status;
};

class Log {
public:
    int initialize();
    int initialize(string text);
    Log ();
    Log (string text);
    ~Log();
    bool isInitialized;
    int add(string text);
    int operator+= (string text);
    int clearLog (bool init = true);
    vector <string> getLog();
    parsedLog getLog(string delim);
private:
    bool initialized;
    vector <string> actionLog;
    static int count;
    string countString();
};

#endif /* LOG_H_ */
/*
 *  Created on: Apr 26, 2011
 * ui.cpp
 *      Author: wjc
 */

#include <iostream>
#include <vector>
#include <sstream>

#include "filedaemon.h"
#include "vsystem.h"
#include "customio.h"
#include "building.h"
#include "log.h"

using namespace std;

bool shouldexit = false;
bool back = false;
int selection;

void addShape();
void modifyVars();
struct getVarResult {
    var result;
    int status;
};

Log actionLog;

var novar = {"ERROR", -1, Reserved};

getVarResult getVar(int type);
void viewBuilding();

int runUI(){
    while (!shouldexit){
        cout<<"Please select an item from the list below and press Enter:"<<endl;

        const int mmenuLength = 2;
        string mmenuOptions[2] = {"Create a new document","Quit"};
        for (int i=0; i<2; i++){
            cout<<i+1<<": "<<mmenuOptions[i]<<endl;
        } cout<<endl;
        selection = getMenuItem(1,mmenuLength);

        if (selection == mmenuLength) return 0; // Quit if it's the last one

        cout<<"Enter a name for your building:"<<endl;
        string buildingTitle;
        getline(cin, buildingTitle);

        Building b(buildingTitle);
        actionLog += "New building " + buildingTitle + " created.";

        const int bmenuLength = 5;
        string bmenuOptions[5] = {"Add shape","Modify variables","View building","View log","Quit"};
        for (int i=0; i<bmenuLength; i++){
            cout<<i+1<<": "<<bmenuOptions[i]<<endl;
        } cout<<endl;
        selection = getMenuItem(1,bmenuLength);

        switch (selection){
        case 1:
            // Add a shape
            break;
        case 2:
            modifyVars();
            break;
        case 3:
            // View building
            break;
        case 4:
        {
            parsedLog parsed = actionLog.getLog("\n");
            if (parsed.status == SUCCESS) {
                cout<<"The following contains the contents of your action log."<<endl;
                cout<<parsed.result<<endl<<endl;
            } else {
                cout<<"Somehow your log is not initialized."<<endl<<endl;
            }
        }
            break;
        case 5:
            shouldexit = true;
            break;
        default:
            cout<<"You entered a number greater than "<<bmenuLength<<" or less than 1. How you did this is a mystery."<<endl<<"[ Press Enter to exit ]"<<endl;
            string temp;
            getline(cin, temp);
            return 0;
        }
        // The following commented-out block is a
        // test of the variable storing system.
        // It will not be used in any final products.

        /*cout << "   Variable Systems Test   "<<endl;
    cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
    cout << endl;
    cout<<"Enter a variable name:"<<endl;
    string varname;
    cin>>varname;
    cout<<"Enter a value (A FLOAT!):"<<endl;
    float value;
    cin>>value;
    cout<<"Checking to see if "<<varname<<" exists."<<endl;
    bool alreadythere = checkVar(varname);
    alreadythere ? cout<<"It exists!"<<endl : cout<<"It doesn't exist."<<endl;
    if (alreadythere){
        cout<<"Changing variable. Function returned "<<changeVar(varname, value)<<endl;
    } else {
        cout<<"Setting variable. Function returned "<<addVar(varname, value)<<endl;
    }
    cout<<"Enter a variable to check:"<<endl;
    string varcheck;
    cin>>varcheck;
    fetchResult result = fetchVar(varcheck);
    if(! result.good){
        cout<<"Variable \""<<varcheck<<"\" doesn't exist!"<<endl;
    } else {
        cout<<"Variable \""<<varcheck<<"\" is equal to "<<result.result<<endl;
    }
    cout<<getVarList("\n","\t")<<endl;
    string exitstr;
    getch;*/
    }
    return 0;
}

void modifyVars(){
    while (! back){
        cout<<"These are your defined variables."<<endl;
        cout<<"Reserved variables have an asterisk preceding them."<<endl;
        vector <var> vars = getVarList();
        for (unsigned int i = 0; i<vars.size(); i++){
            cout<<endl;
            vars[i].reserved ? cout<<" * " : cout<<"   ";
            cout << vars[i].name<<" = ";
            cout<<fixed<<vars[i].value;
        }cout<<endl;
        cout<<"What would you like to do?"<<endl;
        string varMenuOptions[4] = {"Add a variable","Change a variable","Remove a variable","Go back"};
        for (int i = 0; i<4; i++){
            cout<<i+1<<". "<<varMenuOptions[i]<<endl;
        } cout<<endl;
        selection = getMenuItem(1,3);
        switch(selection){
        case 1: // Add variable
        {
            getVarResult gvr = getVar(ADD);
            if (gvr.status == SUCCESS)
                addVar(gvr.result.name, gvr.result.value, UserDefined);
            break;
        }
        case 2: // Change variable
        {
            getVarResult gvr = getVar(CHANGE);
            if (gvr.status == SUCCESS)
                changeVar(gvr.result.name, gvr.result.value);
            break;
        } // switch (selection)
        } // while (!back)
    }
}
getVarResult getVar(int type){
    getVarResult finalResult;
    getVarResult invalidType;
    getVarResult cancelled;
    invalidType.result = novar;
    invalidType.status = INVALID_TYPE;
    cancelled.result = novar;
    cancelled.status = USER_CANCELLED;
    if (type != ADD && type != CHANGE) return invalidType;
    bool usercancelled = false;
    bool nameOK = true;
    bool varIsReserved = false;
    string varName;
    do {
        switch(type){
        case ADD:
            if (!nameOK) cout<<"That variable already exists."<<endl;
            break;
        case CHANGE:
            if (!nameOK) cout<<"That variable has not yet been created."<<endl;
            if (varIsReserved) cout<<"That variable is used by the system and cannot be changed."<<endl;
            break;
        }
        cout<<"Enter the variable's name, or \"BACK\": "; varName = getString(1,16);
        if (varName == "BACK"){
            usercancelled = true;
            break;
        }
        fetchResult testExist = fetchVar(varName);
        switch(type){
        case ADD:
            nameOK = !testExist.good;
            break;
        case CHANGE:
            nameOK = testExist.good;
            varIsReserved = testExist.reserved;
            break;
        default:
            cout << "Function error - int type seems to have changed since user called getVar(int type)."<<endl;
            cout << "[ Press Enter to exit]"<<endl;
            string temp;
            getline(cin, temp);
            return invalidType;
        }
    } while (! nameOK || varIsReserved);
    finalResult.result.name = varName;
    if (usercancelled) return cancelled;
    bool valueOK = true;
    float numValue;
    do {
        if (! valueOK) cout<<"That doesn't seem to be a valid positive number.";
        cout<<"Enter the new value, or \"COPY\" to copy a variable, or \"BACK\":"<<endl;
        string value = getString();

        /*
         * If "BACK" then break do-while(! valueOK)
         */

        if (value == "BACK"){
            usercancelled = true;
            break;
        }
        if(value == "COPY"){
            string copyVar;
            fetchResult varContents;
            bool copyOK = true;
            do {
                if (!copyOK) cout<<"That variable does not exist. Note that names are case-sensitive."<<endl;
                cout<<"Enter the variable to copy, \"VIEW\" to view all, or \"BACK\":"<<endl;
                /*
                 * If "BACK" then break do-while(! valueOK)
                 */
                if (value == "BACK"){
                    usercancelled = true;
                    break;
                }
                copyVar = getString(1,8);
                if (copyVar == "VIEW") {
                    cout<<"Your current variables are as follows:"<<endl;
                    vector <var> vars = getVarList();
                    for (unsigned int i = 0; i<vars.size(); i++){
                        cout<<endl;
                        vars[i].reserved ? cout<<" * " : cout<<"   ";
                        cout << vars[i].name<<" = ";
                        cout<<fixed<<vars[i].value;
                    }cout<<endl;
                } else {
                    varContents = fetchVar(copyVar);
                    copyOK = varContents.good;
                    numValue = varContents.result;
                }
            } while (copyVar == "VIEW" || ! copyOK);
        } else {
            // This code converts from string to number safely.
            stringstream testStream(value);
            if (! (testStream >> numValue))
                valueOK = false;
        }
        if (! usercancelled) break;
    } while (! valueOK);
    finalResult.result.value = numValue;
    if (usercancelled) return cancelled;
    finalResult.status = SUCCESS;
    return finalResult;
}
/*
 * ui.h
 *
 *  Created on: Apr 26, 2011
 *      Author: wjc
 */

#ifndef UI_H_
#define UI_H_

#include "vsystem.h"

int runUI();
void addShape();
void modifyVars();
struct getVarResult {
    var result;
    int status;
};
getVarResult getVar(int type);
void viewBuilding();

#endif /* UI_H_ */
/*
 * building.h
 *
 *  Created on: Apr 30, 2011
 *      Author: wjc
 */

#ifndef BUILDING_H_
#define BUILDING_H_

#include <string>
#include <vector>
#include "consts.h"
#include "solid_type.h"

using namespace std;

struct dimension {
    bool exists;
    float value;
};

class Solid {
public:
    string name;
    string comment;
    solid_type type;
    bool positive;
    dimension dim1;   // Radius, width, or side length
    dimension dim2;   // Height, number of sides, or fraction of sphere_over_n
    dimension dim3;   // Width - only for prism_rect, pyrm_rect and tprym_rect
    Solid ();
    Solid (bool pos);
    Solid (string setName, string setComment, solid_type setType, bool setPos, dimension setDim1,
            dimension setDim2, dimension setDim3);
    ~Solid();
    int countShapes();
    int howMany();
private:
    static int count;
};

class Building {
private:
    string name;
    vector <Solid> components;
public:
    Building(string text);
    void setName(string text);
    string getName();
    vector <Solid> addComponent(Solid component);
};

#endif /* BUILDING_H_ */
/*
 * building.cpp
 *
 *  Created on: May 1, 2011
 *      Author: wjc
 */

#include <string>
#include <vector>

#include "consts.h"
#include "solid_type.h"

using namespace std;

struct dimension {
    bool exists;
    float value;
};

class Solid{
public:
    string name;      // So the user can look at the log
    string comment;   // Expanded version of name, again for the log
    solid_type type;  // Determines the type of Solid
    bool positive;    // Positive = addition; negative = subtraction
    dimension dim1;   // Radius, width, or side length
    dimension dim2;   // Height, number of sides, or fraction of sphere_over_n
    dimension dim3;   // Width - only for prism_rect, pyrm_rect and tprym_rect
    Solid(){
        count++;
    }
    Solid(bool setPos){
        count++;
        positive = setPos;
    }
    Solid (string setName, string setComment, solid_type setType, bool setPos, dimension setDim1,
            dimension setDim2, dimension setDim3){
        count++;
        name = setName;
        comment = setComment;
        type = setType;
        positive = setPos;
        dim1 = setDim1;
        dim2 = setDim2;
        dim3 = setDim3;
    }
    ~Solid(){
        count--;
    }
    int howMany(){
        return count;
    }
    int countSolids(){
        return howMany();
    }
private:
    static int count; // Number of Solids in existence
};

class Building {
private:
    string name;
    vector <Solid> components;
public:
    Building (string text){
        setName(text);
    }
    void setName(string text) {
        name = text;
    }
    string getName(){
        return name;
    }
    vector <Solid> addComponent(Solid component){
        components.push_back(component);
        return components;
    }
};
g++ -o "BuildingGenerator" ./src/bgmath.o ./src/building.o ./src/customio.o \
    ./src/filedaemon.o ./src/log.o ./src/main.o ./src/ui.o ./src/vsystem.o
Osiris-8 JL: make bgmath.o building.o customio.o filedaemon.o log.o main.o ui.o vsystem.o
g++    -c -o bgmath.o bgmath.cpp
g++    -c -o building.o building.cpp
g++    -c -o customio.o customio.cpp
g++    -c -o filedaemon.o filedaemon.cpp
g++    -c -o log.o log.cpp
g++    -c -o main.o main.cpp
g++    -c -o ui.o ui.cpp
g++    -c -o vsystem.o vsystem.cpp
Osiris-8 JL: g++ -o cmd *.o
Undefined symbols for architecture x86_64:
  "Building::Building(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
  "Log::operator+=(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
  "Log::getLog(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
  "Log::Log()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ui.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Osiris-8 JL:
g++    -c -o log.o log.cpp
log.cpp:12:8: error: redefinition of ‘struct logResult’
log.h:15:8: error: previous definition of ‘struct logResult’
log.cpp:17:8: error: redefinition of ‘struct parsedLog’
log.h:20:8: error: previous definition of ‘struct parsedLog’
log.cpp:22:7: error: redefinition of ‘class Log’
log.h:25:7: error: previous definition of ‘class Log’
make: *** [log.o] Error 1
#ifndef LOG_H_
#define LOG_H_

#include <vector>
#include <string>
using namespace std;

struct logResult {
    vector <string> result;
    int status;
};

struct parsedLog {
    string result;
    int status;
};

class Log {
public:
    int initialize();
    int initialize(string text);
    Log ();
    Log (string text);
    bool isInitialized();
    int add(string text);
    int operator+= (string text);
    int clearLog (bool init = true);
    logResult getLog();
    parsedLog getLog(string delim);
private:
    bool initialized;
    vector <string> actionLog;
};

#endif /* LOG_H_ */
#include "log.h"
#include "consts.h"
using namespace std;

int Log::initialize(){
    if (initialized) return ALREADY_INIT;
    actionLog.push_back("*** Log initialized ***");
    initialized = true;
    return SUCCESS;
}
int Log::initialize(string text){
    if (initialized) return ALREADY_INIT;
    // otherwise...
    initialize();
    actionLog.push_back("Initialization message: "+text);
    return SUCCESS;
}
Log::Log (){
    initialize();
}
Log::Log (string text){
    initialize(text);
}
bool Log::isInitialized(){
    return initialized;
}
int Log::add(string text){
    if (!initialized) return NOT_INIT;
    actionLog.push_back(text);
    return SUCCESS;
}
int Log::operator+= (string text){
    return add(text);
}
int Log::clearLog(bool init){
    if (!initialized) return NOT_INIT;
    //delete actionLog;
    initialized = false;
    if (init) return initialize();
    // Else
    return SUCCESS;
}
logResult Log::getLog(){
    if (!initialized){
        logResult final;
        final.status = NOT_INIT;
        return final;
    } else {
        logResult final;
        final.result = actionLog;
        final.status = SUCCESS;
        return final;
    }
}
parsedLog Log::getLog(string delim){
    if (!initialized){
        parsedLog final;
        final.status = NOT_INIT;
        return final;
    } else {
        parsedLog final;
        string logString;
        for (unsigned int i; i<actionLog.size()-1; i++){
            logString += actionLog[i];
            logString += delim;
        }
        logString += actionLog.back();
        final.result = logString;
        final.status = SUCCESS;
        return final;
    }
}
Undefined symbols for architecture x86_64:
  "Building::Building(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)", referenced from:
      runUI()    in ui.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status