c++ - 找不到错误的来源:'Undefined symbols for architecture x86_64' Makefile
问题描述
我收到此错误:
g++ -c location.cpp
g++ -c place.cpp
g++ -c popularplace.cpp
g++ -c person.cpp
g++ -o main main.cpp *.o
Undefined symbols for architecture x86_64:
"sim::PopularPlace::arraycounter", referenced from:
sim::PopularPlace::PopularPlace() in popularplace.o
sim::PopularPlace::PopularPlace(double, double) in popularplace.o
"sim::PopularPlace::places", referenced from:
sim::Person::action() in person.o
sim::PopularPlace::PopularPlace() in popularplace.o
sim::PopularPlace::PopularPlace(double, double) in popularplace.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [main] Error 1
构建此 makefile 时:
main: main.cpp simulation.h location.o place.o popularplace.o person.o
g++ -o main main.cpp *.o
location.o: location.cpp location.hpp simulation.h
g++ -c location.cpp
place.o: place.hpp place.cpp
g++ -c place.cpp
popularplace.o: place.hpp place.cpp simulation.h popularplace.hpp popularplace.cpp
g++ -c popularplace.cpp
person.o: person.cpp person.hpp location.hpp simulation.h place.hpp place.cpp location.cpp popularplace.o
g++ -c person.cpp
clean:
rm *.o
我找不到错误。这是popularplace.cpp 文件:
#include "popularplace.hpp"
#include "simulation.h"
namespace sim{
PopularPlace::PopularPlace()
:open(true){
places[PopularPlace::arraycounter] = this;
PopularPlace::arraycounter++;
}
PopularPlace::PopularPlace(double x, double y)
:Place(x, y), open(true){
places[PopularPlace::arraycounter] = this;
PopularPlace::arraycounter++;
}
bool PopularPlace::isOpen() const{
return open;
}
void PopularPlace::close(int numOfCasesToReopen){
open = false;
}
bool PopularPlace::reopen(int activeCases){
if(activeCases <= numOfCasesToReopen){
open = true;
return true;
} else{
return false;
}
}
}
这是popularplace.hpp 文件:
#ifndef POPULAR_PLACE_HPP
#define POPULAR_PLACE_HPP
#include "simulation.h"
#include "place.hpp"
namespace sim{
class PopularPlace : public Place{
private:
bool open;
int numOfCasesToReopen;
static int arraycounter;
public:
static PopularPlace* places[POPULAR_PLACES];
PopularPlace();
PopularPlace(double x, double y);
bool isOpen() const;
void close(int numOfCasesToReopen);
bool reopen(int activeCases);
};
}
#endif
如果您需要我提供其他信息/代码,我很乐意这样做。谢谢。
解决方案
静态变量需要定义;它们在标头中声明,但也应在 cpp 文件中定义。这也是您初始化它们的地方。例如:
int PopularPlace::arraycounter{0};
PopularPlace* PopularPlace::places[POPULAR_PLACES] = {};
但是,您可以考虑使用 anstd::vector<std::shared_ptr<PopularPlace>>
而不是手动管理的数组。
推荐阅读
- python - AWS 上 TigerGraph 集群的 pyTigerGraph 连接器问题
- python - 对 Python Flask 应用程序的 PUT 请求中的 Json 无法解码
- webkit - 为什么我在使用 Weston/Wayland 时会出现“权限被拒绝”错误
- python - 计算连续天数的温度数据
- git - 如何删除某个文件夹中的所有 git 存储库?
- .net - Autofact 初始化所有注册的服务
- django - Django 隐藏不可用日期
- java - 如何判断它是调用静态方法还是实例方法?
- kibana - Kibana 观察者查询转义不工作的特殊字符
- python - Tensorflow 的 Tiff 解决方法