1

我正在编译一个具有多个头文件的项目,其中一个是具有通用功能的通用“utils”文件。

当我包含此 utils 文件的头文件时,编译失败(请参阅下面的错误),但是当我包含实际的 .cpp 文件时,它可以工作。

我在 MacOS High Sierra 上使用带有 CLion 的 CMakeLists.txt 文件。

以相同方式失败的最小等效项目:

主.cpp:

#include "util.h"

int main() {
    print("Hello");
    return 0;
}

实用程序.h:

#pragma once

#include <string>
#include <iostream>
#include <sstream>


template<typename T>
void print(T thing_to_print);

实用程序.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"

编译成功完成。

有任何想法吗?提前致谢。

4

0 回答 0