os kern错误:" ld:找不到架构x86_64"

时间:2015-06-10 01:02:51

标签: c++ architecture compiler-errors x86-64 clang++

我已经浏览了Stack Overflow和其他网站关于这个着名的错误,所有这些都是非常具体的,在我的情况下我找不到解决方案。我正在创建一个ncurses应用程序,当我尝试编译它时,它会导致以下错误:

Undefined symbols for architecture x86_64:
    "NCRS::End()", referenced from:
        _main in crspro-85eaaf.o
    "NCRS::Start()", referenced from:
        _main in crspro-85eaaf.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我使用以下行编译代码:

$ clang++ crspro.cpp -lncurses -o crspro

以下是代码:

crspro.cpp

#include "ncrs.h"

int main(int argc, char* argv[]) {

    NCRS::Start();
    getch();
    NCRS::End();

    return 0;
}

ncrs.h

#ifndef NCRS_H
#define NCRS_H

#include <ncurses.h>
#include <string>

typedef std::string string;

class NCRS {
private:
    static bool __curses_on;
    static bool __buffer;
    static bool __echo;
    static bool __keypad;
public:
    static void Start(bool bbuffer=false, bool becho=false, bool bkeypad=false);
    static void End();
};

#endif

ncrs.cpp

#include "ncrs.h"

static void NCRS::Start(bool bbuffer=false, bool becho=false, bool bkeypad=false) {
    initscr();
    if (bbuffer) raw();
    if (becho) echo(); else noecho();
    if (bkeypad) keypad(stdscr, TRUE); else keypad(stdscr, FALSE);

    __buffer = bbuffer;
    __echo = becho;
    __keypad = bkeypad;
    __curses_on = true;
}

static void NCRS::End() { nocbreak(); echo(); keypad(stdscr, FALSE); endwin(); }

据我所知,我在代码本身没有任何问题。我试过甚至包括ncrs.cpp(恐怖!!)但我仍然遇到同样的问题。 有人可以帮忙解决这个问题吗?我之前在其他项目中遇到过这个问题而我不得不放弃它们,因为我无法找到解决方案。

感谢任何可以提供帮助的人!

_

_

修改

编译:

clang++ crspro.cpp ncrs.cpp -lncurses -o crspro

返回错误:

Undefined symbols for architecture x86_64:
  "NCRS::__curses_on", referenced from:
      NCRS::Start(bool, bool, bool) in ncrs-e52041.o
  "NCRS::__echo", referenced from:
      NCRS::Start(bool, bool, bool) in ncrs-e52041.o
  "NCRS::__buffer", referenced from:
      NCRS::Start(bool, bool, bool) in ncrs-e52041.o
  "NCRS::__keypad", referenced from:
      NCRS::Start(bool, bool, bool) in ncrs-e52041.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

1 个答案:

答案 0 :(得分:1)

您的编辑不包括ncrs.cpp的任何内容,NCRS::Start()NCRS::End()都是定义的。你可能想要

clang++ crspro.cpp ncrs.cpp -lncurses -o crspro

或者,如果您想单独构建目标文件,然后链接它们:

clang++ -c crspro.cpp -c
clang++ -c ncrs.cpp -c
clang++ crspro.o ncrs.o -lncurses -o crspro

您关于"NCRS::__curses_on"的下一个错误是因为您使用静态变量而未定义它们需要添加

bool NCRS::__curses_on=false;
bool NCRS::__buffer=false;
bool NCRS::__echo=false;
bool NCRS::__keypad=false;

到你的一个.cpp文件中。 (大概ncrs.cpp是合乎逻辑的地方。)

可能值得考虑它们是否应该是静态的(以及函数是否也应该是静态的) - 它们可能需要,但静态类变量本质上是全局变量,这些变量通常会在以后再次出现。它们使得理解代码流变得更加困难,并且可以使多线程和测试变得痛苦。