我到处都在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)
最佳答案
您的编译不包括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
是逻辑位置。)也许值得考虑一下它们是否应该是静态的(以及函数是否也应该是静态的)-它们可能必须是静态的,但是静态类变量本质上是全局变量,以后经常会咬你。它们使理解代码流变得更加困难,并使多线程和测试变得痛苦。