gpt4 book ai didi

c++ - 类和函数模板实例化的 Visual Studio dll 导出问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:12 26 4
gpt4 key购买 nike

我在 win7 中使用 VS2008,在 CentOS 18 中使用 g++ 4.7。只有在 Windows 上使用动态共享库时才会出现此问题。当我将它转换为静态库时,程序链接正常。

我知道在共享库中,模板函数/类应该在头文件中定义,或者模板类型(参数)的模板实例化应该通过编译单元提供。我选择了后者。我以前做过,我经历过

Why can templates only be implemented in the header file?

C++ Shared Library with Templates: Undefined symbols error

但我无法弄清楚为什么在我将库转换为 dll 后在 Windows 中它无法解析符号:错误 LNK2019:未解析的外部符号“void __cdecl HelpingRegistration(double)”(??$HelpingRegistration@N@@YAXN@Z) 在函数 _main 中引用

在 Windows 中,它可以很好地与静态库一起使用。在 Linux 中,动态库和共享库都可以工作。

//Static library
//Library header
#ifndef _TEMPLATED_STATIC_LIB_
#define _TEMPLATED_STATIC_LIB_

#include <iostream>
#include <string>
#include "Export.h"

template<typename T>
class EXPORT TemplatedStaticLib
{
public:
TemplatedStaticLib(){};
~TemplatedStaticLib(){};

void print(T t);

};

template<typename T>
EXPORT void HelpingRegistration(T);

#endif

//库.cpp

#include "TemplatedStaticLib.h"
#include <typeinfo>


template<typename T>
void TemplatedStaticLib<T>::print(T t)
{
std::cout << "Templated Print: "<< t<< " type:: " << typeid(t).name() << std::endl;
}

//Class Template explicit instantiation
template class TemplatedStaticLib<double>;
template class TemplatedStaticLib<std::string>;

template<typename T>
void HelpingRegistration(T t)
{
std::cout << "Function Templated Print: " << t << " type: " << typeid(t).name() << std::endl;
//return t;
}

//function template explicit instantiation
template void HelpingRegistration<>( double );
template void HelpingRegistration<>( std::string );

//Windows 符号导出器

//.h

#ifndef STATIC_LIB_EXPORT
#define STATIC_LIB_EXPORT

#if !defined WIN32
#define EXPORT
#elif defined LIB_EXPORTS
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

//STATIC_LIB_EXPORT
#endif

//库用户.cpp

#include <TemplatedStaticLib/TemplatedStaticLib.h>

#include<string>

int main(int argc, char* argv[])
{
double aDouble = 3.9;
TemplatedStaticLib<double> double_test;
double_test.print(aDouble);

std::string aString = "James";
TemplatedStaticLib<std::string> string_test;
string_test.print(aString);

HelpingRegistration(aDouble);
HelpingRegistration(aString);


return 0;
}

最佳答案

我相信您需要导出特化。您是否在 .cpp 文件中尝试过:

template class EXPORT TemplatedStaticLib<double>;
template class EXPORT TemplatedStaticLib<std::string>;

和你的标题几乎一样:

template class EXPORT TemplateStaticLib<double>;
template class EXPORT TemplateStaticLib<std::string>;

认为 这将与您的 EXPORT 宏一起使用(假设 .cpp 文件见 __declspec(dllexport) 并且 header 见 __declspec(dllimport))。我承认我不是 Windows 的 __declspec 方面的专家。

我承认我的答案来自 intarwebs 上的另一个答案:http://social.msdn.microsoft.com/Forums/vstudio/en-US/4fd49664-e28e-4f23-b1eb-b669d35ad264/function-template-instantation-export-from-dll (一直滚动到底部以获得 Franjo555 的最终版本。)

关于c++ - 类和函数模板实例化的 Visual Studio dll 导出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17519879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com