链接器错误没有明显的原因:未定义的引用

时间:2015-08-05 14:57:09

标签: c++ linker-errors eclipse-cdt

我尝试在C ++中编写一个简单的函数my_to_string(),它带有两个迭代器firstlast。我希望函数具有典型的行为:它将迭代[first,last)并对对象做一些事情。只具有读访问权限的数据。我在一个文件stringformat.h中声明了此函数的声明,它在stringformat.cpp中的定义,我尝试从另一个.cpp文件中调用它。

所有文件编译正常。

我使用Eclipse CDT来构建我的项目。

现在我的问题是我收到以下链接器错误(从Eclipse控制台直接复制粘贴,仅出于隐私原因重命名了主目录):

Invoking: Cross G++ Linker
g++  -o "agos2"  ./agos/pairingfunctions/CantorPairingFunction.o ./agos/pairingfunctions/CantorTupleIncrementer.o ./agos/pairingfunctions/PairingFunction.o  ./agos/machine/Instruction.o ./agos/machine/Machine.o ./agos/machine/MachineFactory.o ./agos/machine/Operation.o ./agos/machine/Program.o  ./agos/goedelnumbering/multiplier/InstructionGoedel.o ./agos/goedelnumbering/multiplier/InstructionIncrementer.o ./agos/goedelnumbering/multiplier/MachineIncrementer.o ./agos/goedelnumbering/multiplier/OperationIncrementer.o ./agos/goedelnumbering/multiplier/ProgramIncrementer.o  ./agos/BigIntegerLibrary/BigInteger.o ./agos/BigIntegerLibrary/BigIntegerAlgorithms.o ./agos/BigIntegerLibrary/BigIntegerUtils.o ./agos/BigIntegerLibrary/BigUnsigned.o ./agos/BigIntegerLibrary/BigUnsignedInABase.o  ./agos/Agos.o ./agos/Int64ToInt64Function.o ./agos/stringformat.o  ./agos.o   
./agos/machine/Machine.o: In function `agos::Machine::toStringWithState() const':
/home/username/workspace-cpp/agos2/Debug/../agos/machine/Machine.cpp:280: undefined reference to `std::string agos::my_to_string<__gnu_cxx::__normal_iterator<long const*, std::vector<long, std::allocator<long> > > >(__gnu_cxx::__normal_iterator<long const*, std::vector<long, std::allocator<long> > >, __gnu_cxx::__normal_iterator<long const*, std::vector<long, std::allocator<long> > >)'
collect2: error: ld returned 1 exit status
make: *** [agos2] Error 1

代码在这里:

stringformat.h

//...
template<class InputIterator>
std::string my_to_string(InputIterator first, InputIterator last);
//...

stringformat.cpp

//...
template<class InputIterator>
string my_to_string(InputIterator first, InputIterator last) {
    ostringstream oss;

    if (last - first > 0) {
        for (; first + 1 != last; ++first) {
            oss << *first << ' ';
        }

        oss << *first;
    }

    return oss.str();
}
//...

代码使用函数:

#include "../stringformat.h"
//...

void my_use_case() {
    vector<int64_t> const& v = ...;
    string s;
    s = my_to_string(v.begin(), v.end()); // Linker complains here; this is line 280
    //...
}

在链接器命令中,包含了stringformat.o,所以我认为应该找到该函数。我还积极检查了我的项目文件夹中是否存在stringformat.o文件。

我还尝试在my_use_case()之前复制粘贴功能定义。然后编译好。没有任何错误。但这不是一个好的解决方案。

0 个答案:

没有答案