什么是未定义的参考/未解决的外部符号错误?什么是常见原因以及如何修复/预防它们?
随意编辑/添加您自己的.
c++ c++-faq linker-errors unresolved-external undefined-reference
谁能解释为什么以下代码无法编译?至少在g ++ 4.2.4上.
更有趣的是,为什么它会在我将MEMBER转换为int时进行编译?
#include <vector>
class Foo {
public:
static const int MEMBER = 1;
};
int main(){
vector<int> v;
v.push_back( Foo::MEMBER ); // undefined reference to `Foo::MEMBER'
v.push_back( (int) Foo::MEMBER ); // OK
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我不知道为什么这段代码不起作用.所有的源文件都编译好了,但是当我尝试链接它们时,编译器会因为未定义的引用错误而对我大喊大叫.这是代码:
main.cpp中:
#include "SDL/SDL.h"
#include "Initilize.cpp"
int main(int argc, char* args[])
{
//Keeps the program looping
bool quit = false;
SDL_Event exit;
//Initilizes, checks for errors
if(Initilize::Start() == -1)
{
SDL_Quit();
}
//main program loop
while(quit == false)
{
//checks for events
while(SDL_PollEvent(&exit))
{
//checks for type of event;
switch(exit.type)
{
case SDL_QUIT:
quit = true;
break;
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Initilize.h:
#ifndef INITILIZE_H
#define INITILIZE_H
#include "SDL/SDL.h"
/* Declares surface screen, its attributes, and Start(); */
class …Run Code Online (Sandbox Code Playgroud) 我正在尝试
map<string, int>
在我的程序中初始化一个静态映射,如下所示:
测试应用程序
class testApp(){
public:
void setup();
void update();
void renew();
static map<string, int> _someMap;
};
Run Code Online (Sandbox Code Playgroud)
测试应用程序
testApp::setup(){
_someMap["something"] = 1;
_someMap["something2"] = 2;
cout<<_someMap["something"]<<"\n";
}
Run Code Online (Sandbox Code Playgroud)
我不想boost使用 map 的这种短暂使用并为我的代码添加源依赖项。我不在,C++11而且程序中没有构造函数,因为该类是某个框架的类。我在 Xcode 上执行上述操作时.cpp,出现以下错误:
Undefined symbols for architecture i386:
"testApp::mapppp", referenced from:
testApp::setup() in testApp.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
-->另外,假设我的地图是私有的,为此我尝试在课堂上这样做:
...
private:
static someVariable;
static void someFunction(); …Run Code Online (Sandbox Code Playgroud) 可能的重复:
C++:对静态类成员的未定义引用
记录器.h:
class Logger {
private:
Logger();
static void log(const string& tag, const string& msg, int level);
static Mutex mutex;
public:
static void fatal(const string&, const string&);
static void error(const string&, const string&);
static void warn(const string&, const string&);
static void debug(const string&, const string&);
static void info(const string&, const string&);
};
Run Code Online (Sandbox Code Playgroud)
记录器.cpp:
#include "Logger.h"
#include <sstream>
ofstream Logger::archivoLog;
void Logger::warn(const string& tag, const string& msg){
Logger::mutex.lock();
log(tag, msg, LOG_WARN);
Logger::mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)
编译时,我收到此错误:
other/Logger.o: In function `Logger::warn(std::basic_string<char, std::char_traits<char>, std::allocator<char> …Run Code Online (Sandbox Code Playgroud) 我今天早些时候提出了一个关于单身人士的问题,我在理解遇到的一些错误时遇到了一些困难.我有以下代码:
class Timing {
public:
static Timing *GetInstance();
private:
Timing();
static Timing *_singleInstance;
};
Run Code Online (Sandbox Code Playgroud)
#include "Timing.h"
static Timing *Timing::GetInstance() { //the first error
if (!_singleInstance) {
_singleInstance = new Timing(); //the second error
}
return _singleInstance;
}
Run Code Online (Sandbox Code Playgroud)
这段代码中有两个错误,我无法弄清楚.
该方法GetInstance()在标头中声明为static.为什么在cpp文件中我必须省略这个词static?它给出了错误:"无法声明成员函数'静态时序*Timing :: GetInstance()'具有静态链接".写它的正确方法是:
Timing *Timing::GetInstance() { ... }
Run Code Online (Sandbox Code Playgroud)为什么我不能写_singleInstance = new Timing();?它给出了错误:"对Timing :: _ singleInstance的未定义引用".我通过_singleInstance在cpp文件中定义为全局变量来解决此错误.
我试图理解单例设计模式并创建了一个最简单的模式:
#include <iostream>
class mySingleton{
private:
static mySingleton *ptr;
mySingleton(){ }
public:
static mySingleton* getInstance(){
if(!ptr){
ptr = new mySingleton();
return ptr;
} else return ptr;
}
void msg(){
std::cout << " Hello World!! " << std::endl;
}
};
int main(){
mySingleton* obj = mySingleton::getInstance();
mySingleton* obj2 = mySingleton::getInstance();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译时,我得到:
Undefined symbols for architecture x86_64:
"mySingleton::ptr", referenced from:
mySingleton::getInstance() in ccm822LI.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
为什么我不能在静态函数中使用ptr,因为ptr也是一个静态变量?我在这里错过了什么吗?