[英]How to fix : 'undefined reference to foo()' with Makefile and g++
I've been trying to get into C++ again, and I have a linker error when I try to compile : 我一直在尝试再次进入C ++,并且在尝试编译时出现链接器错误:
main.cpp:(.text+0x92): undefined reference to `eval(std::string, double, double, double)' main.cpp :(。text + 0x92):对`eval(std :: string,double,double,double,double)'的未定义引用
I've already tried compiling each file separatly and then linking by hand but it never works. 我已经尝试过分别编译每个文件,然后手动链接,但是它永远无法工作。
I have tried numerous solutions provided by other similar posts but none of these work and I don't have any idea on how to fix my problem (which doesn't seem to be that hard) 我已经尝试了其他类似职位提供的众多解决方案,但是这些都不起作用,而且我对如何解决我的问题一无所知(似乎并不难)
main.cpp : main.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;
}
functions.cpp : functions.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();
}
functions.hpp : functions.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
Makefile : 生成文件:
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 is compiled against a different ABI than functions.cpp because of : main.cpp是针对与function.cpp不同的ABI进行编译的,原因是:
#define _GLIBCXX_USE_CXX11_ABI 0
Either remove that line from main.cpp, or add it to functions.cpp . 从main.cpp中删除该行,或将其添加到functions.cpp中。
More details : https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html 更多详细信息: https : //gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.