请教:cuda的动态并行库,与c++ 的iomanip库,为什么在特殊情况下,存在冲突?

GKatHere 2024-10-17 18:52:01
//    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;
}

 

...全文
90 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

589

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧