架构x86_64的未定义符号与c++的链接错误
Undefined symbols for architecture x86_64 Linker Error with C++
我有一个程序,用户在其中输入飞机的操作。用户可以选择任意多的操作(保持,直线,着陆等),因为他/她想。用户可通过操作5计算所需的进油量。
我将抽象工厂设计模式应用到系统中,如下所示:
FlightModeInterface.h
class FlightModeInterface{
protected:
float time, fuel_rate, start, end, pace, distance;
float total;
public:
enum FLIGHT_MODES{
HOLDING,
RAISING,
LANDING,
STRAIGHT
};
FlightModeInterface();
virtual ~FlightModeInterface(){ }
virtual float calcFuel(float, float, float,
float, float, float) = 0;
static FlightModeInterface* createFactory(FLIGHT_MODES);
};
FlightModeFactory.cpp
#include "FlightModeInterface.h"
#include "Holding.h"
#include "Landing.h"
#include "Raising.h"
#include "Straight.h"
class FlightModeFactory{
protected:
float time, fuel_rate, start, end, pace, distance;
float total;
public:
static FlightModeInterface* createFactory(FlightModeInterface::FLIGHT_MODES mode){
switch (mode) {
case FlightModeInterface::HOLDING:
return new Holding();
case FlightModeInterface::LANDING:
return new Landing();
case FlightModeInterface::RAISING:
return new Raising();
case FlightModeInterface::STRAIGHT:
return new Straight();
}
throw "invalid flight mode.";
}
};
CalculateFuel.cpp
#include <iostream>
#include <stdio.h>
#include "FlightModeInterface.h"
using namespace std;
int main(){
char op = 's';
float time=0, fuel_rate=0, start=0, end=0, pace=0, distance=0;
float total = 0;
FlightModeInterface *factory;
while(op != 'x') {
float hold_result, raise_result, land_result, str_result;
cout << "Please select an operation: " << endl;
cout << "1 ---> Holding flight" << endl;
cout << "2 ---> Raising" << endl;
cout << "3 ---> Landing " << endl;
cout << "4 ---> Straight " << endl;
cout << "5 ---> Calculate total fuel consumption" << endl;
cout << "x ---> Exit " << endl;
cin >> op;
switch(op){
case '1':
cout << "Holding time (minutes): ";
cin >> time;
cout << "Fuel rate (kg/sec): ";
cin >> fuel_rate;
factory = FlightModeInterface::createFactory(FlightModeInterface::HOLDING);
hold_result = factory -> calcFuel(time, fuel_rate, 0, 0, 0, 0);
total += hold_result;
break;
case '5':
cout <<"Total fuel requirement: "<< total << " kg"<< endl;
total = 0;
break;
case 'x':
return 0;
default:
continue;
}
}
return 0;
}
当我运行CalculateFuel.cpp时,我遇到了这个错误(我使用Eclipse Builder在MAC上构建代码):
23:46:08 **** Build of configuration Debug for project CalculateFuel ****
make all
Building file: ../src/CalculateFuel.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/CalculateFuel.d" -MT"src/CalculateFuel.d" -o "src/CalculateFuel.o" "../src/CalculateFuel.cpp"
Finished building: ../src/CalculateFuel.cpp
Building file: ../src/FlightModeFactory.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/FlightModeFactory.d" -MT"src/FlightModeFactory.d" -o "src/FlightModeFactory.o" "../src/FlightModeFactory.cpp"
Finished building: ../src/FlightModeFactory.cpp
Building target: CalculateFuel
Invoking: MacOS X C++ Linker
g++ -o "CalculateFuel" ./src/CalculateFuel.o ./src/FlightModeFactory.o
Undefined symbols for architecture x86_64:
"FlightModeInterface::createFactory(FlightModeInterface::FLIGHT_MODES)", referenced from:
_main in CalculateFuel.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: *** [CalculateFuel] Error 1
对于如何解决这个问题有什么想法吗?
将FlightModeFactory.cpp替换为FlightModeFactory.h后问题解决。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 使用C链接在函数内部创建C++模板
- Visual Studio mkl_link_tool.exe链接错误
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 有人能帮我处理这个链接列表吗?C++