c++ - 如何修复:使用 Makefile 和 g++ 对 foo() 的未定义引用
问题描述
我一直在尝试再次进入 C++,当我尝试编译时出现链接器错误:
main.cpp:(.text+0x92): undefined reference to `eval(std::string, double, double, double)'
我已经尝试过分别编译每个文件,然后手动链接,但它从来没有用过。
我尝试了其他类似帖子提供的许多解决方案,但这些都不起作用,我不知道如何解决我的问题(这似乎并不难)
主.cpp:
#define _GLIBCXX_USE_CXX11_ABI 0
#include <iostream>
#include "functions.h"
int main()
{
std::string expression = "1/2+x";
double x = 1.45;
double y = 1.65;
double z = 1.77;
double result = 0.0;
result = eval(expression,x,y,z);
std::cout << result << std::endl;
return 0;
}
函数.cpp:
#include "functions.h"
double eval(std::string expression_s, double x, double y, double z)
{
typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t;
symbol_table_t symbol_table0;
symbol_table_t symbol_table1;
symbol_table_t symbol_table2;
expression_t expression;
parser_t parser;
symbol_table0.add_variable("x",x);
symbol_table1.add_variable("y",y);
symbol_table2.add_variable("z",z);
expression.register_symbol_table(symbol_table0);
expression.register_symbol_table(symbol_table1);
expression.register_symbol_table(symbol_table2);
parser.compile(expression_s,expression);
std::cout << expression.value();
return expression.value();
}
函数.hpp:
ifndef FUNCTIONS_H_INCLUDED
#define FUNCTIONS_H_INCLUDED
#include "exprtk/exprtk.hpp"
#include <iostream>
double eval(std::string expression_s, double x, double y, double z);
#endif
生成文件:
CC = g++
EXEC = Crystal_MET
LIBS =
FLAGS =
all: main.o
$(CC) *.o -o $(EXEC) $(LIBS)
main.o : functions.o main.cpp functions.h
$(CC) main.cpp -c $(FLAGS)
functions.o : functions.cpp functions.h
$(CC) functions.cpp -c $(FLAGS)
clear :
rm -f *.o
mr_proper :
rm -f *.o $(EXEC)
解决方案
main.cpp 是针对与 functions.cpp 不同的 ABI 编译的,因为:
#define _GLIBCXX_USE_CXX11_ABI 0
从 main.cpp 中删除该行,或将其添加到 functions.cpp 中。
更多细节:https ://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
推荐阅读
- javascript - scrollToIndex 在本机反应中超出范围
- python-3.x - 打印列表中的条目及其在列表中的次数
- c++ - 我是 OOP 的新手,正在努力解决一个基本的继承错误:“{”标记之前的预期类名
- python - 当我打印(*args)时会发生什么(注意星号*)
- flutter - 颤振:获取画廊图像以显示在刷卡中
- c++ - 如何使数据成员在一个类中被继承,但在另一个类中不被继承
- c++ - 递归函数中迭代到下一个节点与递归函数调用之间的区别
- javascript - 使用 jQuery .click 有效,但 .touchstart 无效
- apache-kafka - Kafka 代理将共享相同的位置来存储数据日志;如果他们在一个集群中
- firebase - Flutter - getx 如何从 firebase 获取子类数据