更改包含给定功能的源时,“对...的未定义引用”

时间:2018-09-10 08:55:59

标签: c++ linker undefined-reference

我有一个非常简单的项目,其中包含两个源和一个标头:

  • math_precision_io_test.cc(包含main)。 main包含以下几行:

    int retval = 0;
    retval = write_datum<float>(file1, &f2, "float");
    retval = write_datum<double>(file2, &d2, "double");
    
  • math_precision_io.cc,包含要使用的功能,包括

    template<class T>
    int write_datum(std::ofstream & file, const T * datum, const char* descr) {
        static_assert(std::is_same<T, double>::value ||
                std::is_same<T, float>::value ||
                std::is_same<T, int>::value ||
                std::is_same<T, char>::value,
                "write_datum is not defined on this class");
    
        if (file.good()) {
            const size_t data_size = sizeof(T);
            file.write((char *) datum, data_size);
            if (descr != NULL) {
                std::cout << "Writing datum " << descr << std::endl;
            }
            return 0;
        } else {
            return 1;
        }
    }
    
  • math_precision_io.h(包含在math_precision_io_test.cc中,以及其他声明)

    template<class T>
    int write_datum(std::ofstream & file, const T * datum, const char* descr = NULL);
    

两个源都可以正常编译(将对象放置在目录obj/中)。 与

链接时
g++ -g -g3 -Wall -Wunused -Wuninitialized -Wextra -fmessage-length=0 -std=gnu++11 -o math_precision_io_test obj/math_precision_io_test.o obj/math_precision_io.o 

我明白了

math_precision_io_test.cc:74: undefined reference to `int write_datum<float>(std::basic_ofstream<char, std::char_traits<char> >&, float const*, char const*)'
math_precision_io_test.cc:75: undefined reference to `int write_datum<double>(std::basic_ofstream<char, std::char_traits<char> >&, double const*, char const*)'

但是,如果仅将功能行write_datummath_precision_io.cc移到math_precision_io_test.cc,进行编译和链接,该错误就会消失。

我不明白为什么。

该错误的原因是什么,如何解决? (这意味着将函数定义保留在math_precision_io.cc中,然后链接正常)。

注意:我发现的问题的答案确实存在于顶部链接至的问题的答案中。 但是问题本身就不同了,可能无法立即找到两者之间的联系。这正是我发生的事情(否则,我不会问这个问题)。

0 个答案:

没有答案