cmake链接templete类给出了未定义的参考

时间:2020-07-28 03:14:52

标签: c++ templates cmake

文件结构

Base|
      Foo |
          | Foo.hpp & Foo.cpp

      Bar |
          | Bar.hpp & Bar.cpp

      main.cpp & CMakeLists.txt

Bar.hpp

template <typename Ty>
class Bar {
public:
    float Value() const;
};    

Bar.cpp

#include "Bar.hpp"
template<typename Ty>
float Bar<Ty>::Value() const {
    return 1234.0;
}

Foo.hpp

#include "../Bar/Bar.hpp"
class Foo : public Bar<int> {
public:
    float Get() const;
};

Foo.cpp

#include "Foo.hpp"
float Foo::Get() const {
    return Value();
}

CMakeLists.txt的主要部分

add_library(Bar_lib Bar/Bar.cpp Bar/Bar.hpp)
add_library(Foo_lib Foo/Foo.cpp Foo/Foo.hpp)
target_link_libraries(Foo_lib Bar_lib)
add_executable(testing main.cpp)
target_link_libraries(testing Foo_lib)

main.cpp文件仅调用foo.Get(),当我运行cmake&make时会给出

/usr/bin/ld: libFoo_lib.a(Foo.cpp.o): in function `Foo::Get() const':
Foo/Foo.cpp: undefined reference to `Bar<int>::Value() const'

但是当我将所有内容放入main.cpp文件中时,它将成功编译。因此,我知道它与make有关。我的问题是如何修改CMakeLists.txt甚至cpp文件以使此文件运行?我是cmake的菜鸟,所以如果我问一个愚蠢的问题,对不起。非常感谢每个建议

0 个答案:

没有答案