Visual Studio 2017和CMake出现致命错误LNK1104

Visual Studio 2017和CMake出现致命错误LNK1104,cmake,visual-studio-2017,dllexport,Cmake,Visual Studio 2017,Dllexport,我在matrix_utils.hpp文件中有以下标题: #include "someIncludes" void ReadMtxMatrixHeader(){} int ScanCurrentLine() {} void ReadMtxMatrixHeader( {} template<typename T> void RTS_EXPORTS ReadMtxMatrixToCSR() {} template<typename T> void RTS_EXPORT

我在matrix_utils.hpp文件中有以下标题:

#include "someIncludes"

void ReadMtxMatrixHeader(){}

int ScanCurrentLine() {}

void ReadMtxMatrixHeader( {}

template<typename T> void RTS_EXPORTS ReadMtxMatrixToCSR() {}

template<typename T> void RTS_EXPORTS ReadMtxMatrixToColMajorArray() {}
此标头是名为“utils”的模块的一部分,由目标“rts\u test\u utils”使用。这段代码在Linux和使用Cygwin和CLion的Windows上运行良好。但当我尝试使用Visual Studio 2017(我的项目是一个CMake项目)时,我在构建“rts\u test\u utils”时遇到了这个错误:

Visual Studio为rts_utils生成DLL,但不生成库如果我在“matrix_utils.hpp”中添加一个类似下面的伪类,那么它会工作并创建一个rts_utilsd.lib。为什么?

class RTS_EXPORTS Foo{}; 

根据oLen的评论,我在matrix_utils.cpp(可能也在标题中)中添加了以下代码,以强制编译器查看模板函数是否已导出:

template void RTS_EXPORTS
ReadMtxMatrixToColMajorArray(std::vector<float> &col_major_host_ptr,
                           const std::string filename, bool is_one_based);
模板无效RTS\u导出
ReadmtxMatricExtocolMajorray(标准::向量和列主主机),
const std::字符串文件名,bool是基于一个的);

我知道我会将此函数与浮点专门化一起使用,因此它甚至不会被浪费。

我的猜测是,编译器没有看到任何要导出的内容,因为您要导出的函数是从未调用过的模板函数,因此经过优化。我认为如果你有
void rts\u EXPORTS foo(){…}
或者你专门化了一个模板函数,也会创建一个rts\u utilsd.lib。因此,这意味着GNU编译器更智能,因为它可以看到我的测试单元“rts\u test\u utils”中使用了一个导出的函数,即使它在头中没有专门化,所以它导出函数。但是MSVC在检查它们是否在我的测试单元中使用之前对它们进行了优化;您一定不要忘记,在GNU库中,函数在默认情况下是可见的,而在MSVC库中,它们在默认情况下是隐藏的。
class RTS_EXPORTS Foo{}; 
template void RTS_EXPORTS
ReadMtxMatrixToColMajorArray(std::vector<float> &col_major_host_ptr,
                           const std::string filename, bool is_one_based);