本文基于在visual studio中利用单个解决方案,来开发一个可执行新项目,且同时包含一个新开发dll项目,这个可执行主项目能够同步调用dll子项目,相当于一个解决方案包含多个子项目的有依赖编译。
这种项目组织方式的优点在于:常规dll开发需要有一个代码调试项目,调试好了再用一个dll生成项目,最后再用要给dll调用项目去验证,但使用这种单个解决方案包含2个子项目的方式,就可以代替上面的3个项目,而且最大的好处是同样可以调试dll内部的函数,包括cuda的核函数,也可以通过Nsight加断点进入调试。
这里以开发一个cuda dll为例,子项目为该cuda dll,主项目为调用cuda dll的可执行项目。
1. 创建解决方案/主项目/子项目:解决方案命名为Solution_cuda_detection,其中解决方案的名字只能跟主项目方案一致。因此主项目名为Solution_cuda_detection用于运行,子项目名为dll_detect2用于生成dll。
2. 细化子项目dll_detect2
- 设置项目属性依赖:把cuda的prop加载进来,相当于设置cuda的头文件路径、库文件路径、库文件名
- 设置生成依赖:该项目属性/生成依赖需要自定义为CUDA10.2
- 设置文件的属性:在该项目新建cu文件和cuh文件,两个文件/属性/常规中,设置从生成中排除为否,设置项类型为CUDA C/C++
3. 细化主项目Solution_cuda_detection
- 设置引用:主项目需要调用子项目的dll所以设置主项目的引用为子项目
- 设置头文件库文件的依赖路径: 也就是要把dll子项目的头文件路径、库文件路径、库文件名都设置到主项目的属性页。
其中:路径可以借用解决方案项目自动生成的宏$(SolutionDir),因此头文件路径为$(SolutionDir)\dll_detects,库文件路径为$(SolutionDir)\x64\debug,这里由于该子项目生成的lib和dll会自动生成到主项目的可执行文件路径去,所以不是子项目的x64\debug而是主项目的x64\debug,这是跟别的项目最大不同。库文件名在链接器/输入中都设置为dll_detect2.lib即可。只有如上设置,才能保证库文件被找到。
4. 运行主项目,或者调试主项目:
- 在点击开始运行后,理论上会自动先编译子项目,然后编译主项目,然后运行主项目exe
- 在debug模式下,主项目调用dll时,是可以进入子项目dll的每一个函数,甚至在Nsight模式下进入cuda核函数。而在release模式下,主项目才是直接调用dll。