我正在编译一个包含多个头文件的项目,其中一个是带有通用功能的通用“utils”文件。
当我包含此utils文件的头文件时,编译失败(请参阅下面的错误),但是当我包含实际的.cpp文件时,它可以正常工作。
我在MacOS High Sierra上使用带有CLion的CMakeLists.txt文件。
以同样方式失败的最小等效项目:
main.cpp中:
#include "util.h"
int main() {
print("Hello");
return 0;
}
util.h:
#pragma once
#include <string>
#include <iostream>
#include <sstream>
template<typename T>
void print(T thing_to_print);
util.cpp:
#include "util.h"
template <typename T>
void print(T thing_to_print){
std::cout << thing_to_print << std::endl;
}
的CMakeLists.txt:
cmake_minimum_required(VERSION 3.7)
project(example)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_VERBOSE_MAKEFILE ON)
SET(UTILS_MINIMAL_LIB_FILES util.h util.cpp)
add_library(utils_lib_minimal ${UTILS_MINIMAL_LIB_FILES})
add_executable(main_test main.cpp)
target_link_libraries(main_test utils_lib_minimal)
构建失败:
Undefined symbols for architecture x86_64:
"void print<char const*>(char const*)", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
但是,当我将include语句更改为:
时#include "util.cpp"
编译成功完成。
有什么想法吗? 提前谢谢。