gpt4 book ai didi

c++ - 操作系统内核错误 : "ld: symbol(s) not found for architecture x86_64"

转载 作者:行者123 更新时间:2023-11-28 06:13:38 24 4
gpt4 key购买 nike

关于这个著名的错误,我在 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 是合乎逻辑的地方。)

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

关于c++ - 操作系统内核错误 : "ld: symbol(s) not found for architecture x86_64",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30745382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com