C ++链接库未定义引用

时间:2018-05-25 12:10:52

标签: c++ cmake

修改 感谢用户Richard Critten,此问题归结为模板,以及我对其工作原理的理解。我不得不将函数实现移动到类头中,否则它们不会被编译为某种任意类型。见Why can templates only be implemented in the header file?

我正在编写一个模板类Tensor,它可以被初始化以保存T类型的元素,其构造函数需要一些参数。

我发现如果我尝试在任何其他文件中创建类Tensor的对象,它将失败并显示undefined reference。我确保我正确地包含了标题,甚至创建了一个与名为test_boi()的类无关的函数,可以被其他文件成功调用。

我不会详细介绍我的测试设置,但我有一个包含3个文件的MWE:tensor.cpptensor.hmain.cpp。在tensor.cpp我有一个main(),在取消注释时可以使用。它与main.cpp中的undefined reference相同,但tensor.h错误失败。

对于构建(使用CMake),我使用tensor.cpptest_boi()创建一个库并将其添加到我的可执行文件中。我想这可能是我的问题,但我不确定我做错了什么。制作图书馆是我刚开始做的事情,那里有大量的信息。

我可以从Main.exe调用tensor.cpp(当我不创建对象时)告诉我Main.exe已经编译,并且main()可以访问}}。当我将tensor.cpp放入add_library (libTensor tensor.h tensor.cpp) add_executable(Main.exe test_main.cpp) target_link_libraries(Main.exe libTensor) #add_executable (Tensor.exe tensor.cpp) #target_link_libraries (Tensor.exe Tensor) 时,我可以创建这些对象这一事实告诉我,我的课程中没有任何内容。 “未定义的引用”stackoverflow帖子很猖獗,所以我找不到符合我特定问题的任何内容。

我的CMake脚本的相关部分

tensor.h

我的班级定义(#ifndef TENSOR_H #define TENSOR_H #include <vector> template<typename T> class MyClass { int width, height; public: MyClass(int n, int m) { height = n; width = m; }; MyClass(int n, int m, std::vector<T> elems); }; int test_bois(); #endif

tensor.cpp

我的函数实现(#include <iostream> #include "tensor.h" template<typename T> Tensor<T>::Tensor(int n, int m) { // shape = (height, width); height = n; width = m; } template<typename T> Tensor<T>::Tensor(int n, int m, std::vector<T> elems) { // shape = (height, width); height = n + 100; width = m + 100; } int test_bois() { return 42; } // int main() // { // std::vector<int> elems(10); // int height = 2; // int width = 2; // Tensor<int> *my_obj_zero = new Tensor<int>(height, width); // Tensor<int> *my_obj_one= new Tensor<int>(height, width, elems); // std::cout << my_obj_zero->shape() << std::endl; // std::cout << my_obj_one->shape() << std::endl; // std::cout << "Hello World!!" << std::endl; // return 0; // } ) ```

main.cpp

#include <iostream> #include "tensor.h" int main() { std::cout << test_boi() << std::endl; // this block commented out to get successful run std::vector<int> elems(10); int height = 2; int width = 2; Tensor<int> *my_obj_zero = new Tensor<int>(height, width); Tensor<int> *my_obj_one= new Tensor<int>(height, width, elems); std::cout << my_obj_zero->shape() << std::endl; std::cout << my_obj_one->shape() << std::endl; std::cout << "Hello World!!" << std::endl; return 0; }

NOT EXISTS

0 个答案:

没有答案