首页 > 解决方案 > 如何修复:使用 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)

标签: c++linker

解决方案


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


推荐阅读