C++ &引用;“未定义的符号”;调用C++;函数从另一个文件中删除

C++ &引用;“未定义的符号”;调用C++;函数从另一个文件中删除,c++,linker,makefile,undefined,symbols,C++,Linker,Makefile,Undefined,Symbols,我有两组文件:PolynomialArithmetic.h/cpp和Options.h/cpp 选项h定义为: // Options.h #ifndef Options_h #define Options_h #define BINARY_HEAP 0 inline int chosenHeap (); #endif // Options.cpp #include "Options.h" inline int chosenHeap() { return BINARY_HEAP;

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

选项h定义为:

// Options.h

#ifndef Options_h
#define Options_h

#define BINARY_HEAP 0

inline int chosenHeap ();


#endif
// Options.cpp

#include "Options.h"

inline int chosenHeap() { return BINARY_HEAP; }
Options.cpp定义为:

// Options.h

#ifndef Options_h
#define Options_h

#define BINARY_HEAP 0

inline int chosenHeap ();


#endif
// 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 

有什么想法吗?

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

从函数中删除内联规范。编译器没有将任何代码放入您的选项。obj。

内联函数必须位于标题中,因为它必须在PolynomialArithmetic.cpp的编译过程中可用。 所以标题选项.h必须看起来像

inline int chosenHeap() { return BINARY_HEAP; }

内联函数必须位于标头中,因为它必须在PolynomialArithmetic.cpp的编译过程中可用。 所以标题选项.h必须看起来像

inline int chosenHeap() { return BINARY_HEAP; }