使用Visual Studio 2017和CMake

时间:2017-04-09 23:11:26

标签: 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_EXPORTS ReadMtxMatrixToColMajorArray() {}

这里的实施并不重要,所以我留下了空括号。

RTS_EXPORTS是一个宏:

#  define RTS_EXPORTS __declspec(dllexport) // if WIN32
#  define RTS_EXPORTS __attribute__ ((visibility ("default"))) // if GNUC >=4

此标头是名为“utils”的模块的一部分,由目标“rts_test_utils”使用。此代码在Linux和Windows上使用Cygwin和CLion完美运行。但是一旦我尝试使用Visual Studio 2017(我的项目是一个CMake项目),我在构建“rts_test_utils”时遇到此错误:

$buildPath\build\x86-Debug\modules\utils\LINK : fatal error LNK1104: 
cannot open file '..\..\lib\Debug\rts_utilsd.lib'

Visual Studio为rts_utils生成DLL,但不生成lib。 如果我将类似下面的虚拟类添加到“matrix_utils.hpp”,那么它可以工作并创建一个rts_utilsd.lib。为什么?

class RTS_EXPORTS Foo{}; 

1 个答案:

答案 0 :(得分:0)

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

template void RTS_EXPORTS
ReadMtxMatrixToColMajorArray(std::vector<float> &col_major_host_ptr,
                           const std::string filename, bool is_one_based);

我知道我会将这个函数用于float特化,所以它甚至都没有浪费。