589
社区成员




// vs2022, c++20, cuda12.6, x64, DEBUG
//
// 请教下,为什么在自建lib项目中使用了<iomanip>,
// 而如果在cuda动态并行项目中,使用了此lib, 但不主动使用<iomanip>
// 那么,编译就会失败
// 一个简单自建lib
#include <iomanip>
void fnTestLib()
{
std::setiosflags(std::ios::showpoint);
}
// 一个简单的cuda项目
#include "D:/MyProjects/TestLib/TestLib.h"
#pragma comment(lib, "D:/MyProjects/TestLib/x64/Debug/TestLib.lib")
__global__ void k3(){}
__global__ void k2(){ k3 << <1, 1 >> > ();}
__global__ void k1(){ k2 << <1, 1 >> > ();}
int main()
{
fnTestLib(); // 调用lib函数
k1 << <1, 1 >> > (); // cuda动态并行
return 0;
}
// 编译cuda项目时,产生以下错误信息:
/*
1>libcpmt.lib(xthrow.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(kernel.cu.obj 中)
1>libcpmt.lib(xthrow.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MDd_DynamicDebug”(kernel.cu.obj 中)
1>libcpmt.lib(xmbtowc.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(kernel.cu.obj 中)
1>libcpmt.lib(xmbtowc.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MDd_DynamicDebug”(kernel.cu.obj 中)
1>libcpmt.lib(iomanip.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(kernel.cu.obj 中)
1>libcpmt.lib(iomanip.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MDd_DynamicDebug”(kernel.cu.obj 中)
1> 正在创建库 D:\MyProjects\TestCUDA\x64\Debug\TestCUDA.lib 和对象 D:\MyProjects\TestCUDA\x64\Debug\TestCUDA.exp
1>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
*/
// 但是,如果不使用cuda动态并行,
// 则编译成功
__global__ void k3(){}
//__global__ void k2(){ k3 << <1, 1 >> > ();}
//__global__ void k1(){ k2 << <1, 1 >> > ();}
int main()
{
fnTestLib();
k3 << <1, 1 >> > ();
return 0;
}
// 这还不是最奇怪的,奇怪的是,
// 如果在cuda项目中,添加一个cpp文件,主动使用一下<iomanip>
// 那么编译仍然会成功
// cuda项目中的一个简单cpp:
#include <iomanip>
void cpptst()
{
std::setiosflags(std::ios::showpoint);
}
// cuda项目照样的动态并行
__global__ void k3(){}
__global__ void k2(){ k3 << <1, 1 >> > ();}
__global__ void k1(){ k2 << <1, 1 >> > ();}
int main()
{
fnTestLib();
k1 << <1, 1 >> > ();
return 0;
}