【问题标题】:"Undefined Symbols" when calling C++ function from another file从另一个文件调用 C++ 函数时出现“未定义符号”
【发布时间】:2012-07-02 17:47:16
【问题描述】:

我有两组文件:PolynomialArithmetic.h/cpp 和 Options.h/cpp

Options.h 定义为:

// Options.h

#ifndef Options_h
#define Options_h

#define BINARY_HEAP 0

inline int chosenHeap ();


#endif

Options.cpp 定义为:

// Options.cpp

#include "Options.h"

inline int chosenHeap() { return BINARY_HEAP; }

PolynomialArithmetic.cpp 包含以下内容:

// PolynomialArithmetic.cpp

#include "PolynomialArithmetic.h"
#include "Options.h"

void foo () {
...
    if (chosenHeap() == BINARY_HEAP) {
        // DO SOMETHING
    }
...
}

当我编译时,我得到了错误:

Undefined symbols for architecture x86_64:
    "chosenHeap()", referenced from: foo() in PolynomialArithmetic.o

我猜这是某种链接错误。以下是我编译代码的方式:

# Makefile

# some configs
....

main: Options.o PolynomialArithmetic.o
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)


Options.o: Options.h Options.cpp
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c Options.cpp

PolynomialArithmetic.o: PolynomialArithmetic.cpp PolynomialArithmetic.h Options.h
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c PolynomialArithmetic.cpp 

有什么想法吗?

【问题讨论】:

    标签: c++ linker makefile undefined symbols


    【解决方案1】:

    内联函数必须在头文件中,因为它必须在编译 PolynomialArithmetic.cpp 期间可用。 所以标题 Options.h 必须看起来像

    inline int chosenHeap() { return BINARY_HEAP; }
    

    【讨论】:

      【解决方案2】:

      从您的函数中删除内联规范。编译器不会将任何代码放入您的 Options.obj。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-17
        • 2020-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-15
        • 2019-10-29
        相关资源
        最近更新 更多