再次学习c ++:cxx11链接问题

时间:2018-12-08 09:49:48

标签: c++ cmake g++ clang++

您好,感谢您的帮助! 我是一位经验丰富的Java开发人员,因此决定在业余时间重新学习c ++。现在,我有一个非常简单的程序遇到了严重的问题。我正在尝试使用模板...参数调用方法。

我在TestTemplate.cpp中定义了一个主要方法,该方法实例化了一个TestLib类,该类在TestLib.h中定义并在TestLib.cpp中实现。

最初是通过cmake进行编译的,然后我通过g ++和clang ++进行了编译。而且总是几乎一样。

通过cmake进行编译显示:

[ 25%] Building CXX object CMakeFiles/TestLib.dir/TestLib.cpp.o
[ 50%] Linking CXX static library libTestLib.a
[ 50%] Built target TestLib
[ 75%] Building CXX object CMakeFiles/TemplateTest.dir/TestTemplate.cpp.o
[100%] Linking CXX executable TemplateTest
/usr/bin/ld: CMakeFiles/TemplateTest.dir/TestTemplate.cpp.o: in function `main':
TestTemplate.cpp:(.text+0x8e): undefined reference to `void TestLib::doTemplateLibCall<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/TemplateTest.dir/build.make:85: TemplateTest] Fehler 1
make[1]: *** [CMakeFiles/Makefile2:110: CMakeFiles/TemplateTest.dir/all] Fehler 2
make: *** [Makefile:84: all] Fehler 2

通过clang ++或g ++进行编译会产生以下输出:

/usr/bin/ld: /tmp/TestTemplate-85deb0.o: in function `main':
TestTemplate.cpp:(.text+0x92): undefined reference to `void TestLib::doTemplateLibCall<std::string>(std::string)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

奇怪的是:将TestLib.cpp的实现复制到TestTemplate.cpp的工作。当我尝试在自己的文件中实现TestLib.cpp时,才出现错误。

CMakeLists.txt:

cmake_minimum_required (VERSION 3.3)
project (TemplateTest)
set (CMAKE_CXX_STANDARD 11)
set (CMAKE_CXX_STANDARD_REQUIRED ON)
set (D_GLIBCXX_USE_CXX11_ABI 0)

include_directories("header")

add_library (TestLib TestLib.cpp)
add_executable (TemplateTest TestTemplate.cpp)
target_link_libraries (TemplateTest TestLib)

TestTemplate.cpp:

#include <iostream>
#include <string>
#include <TestLib.h>

template<typename... ParamType>
void doTemplateCall(ParamType... params) {
  std::printf("In doTemplateCall\n");
}

int main() {
    printf("In main..\n");
    doTemplateCall(std::string("Hello world"));
    TestLib lib;
    lib.doTemplateLibCall(std::string("Hello lib world"));
}

TestLib.h:

#ifndef TestLibH
#define TestLibH

class TestLib {
public:
  template<typename... ParamType>
  void doTemplateLibCall(ParamType... params);
};

#endif

TestLib.cpp:

#include <iostream>
#include <TestLib.h>

template<typename... ParamType>
void TestLib::doTemplateLibCall(ParamType... params) {
  std::printf("In doTemplateLibCall\n");
}

0 个答案:

没有答案