1.1.说明:
多项目开发尽可能实现代码模块化,减少对其它项目依赖性,最好能够独立实现它设计功能
如创建一个解决方案,一个UI窗体部分,一个网络通信,一个视觉采集,一个视觉算法
在网络项目不会使用任何关于C++窗体东西,减少项目间耦合性,让模块功能独立不依赖于另一项目
1.2.步骤:
创建解决方案TcyVisionSystem,添加项目TcyHalcon基于控制台,添加项目TcyVisionUI基于窗体
解决方案--属性--通用属性--启用项目:
当前启动项目:...
多个启动项目:适用多进程调试及多exe间通信调试少见。服务器程序常用一监听一个发送
1.3.注意:
若项目Project2(.exe)需要Project1(dll)注意生成顺序,先project1然后project2
添加项目依赖项:解决方案--属性--通用属性--项目依赖性:(项目:Priject2 依赖于:Project1)
不要出现相互依赖情况 (1依赖2,2依赖3,3依赖1也不行)
2.项目文件夹结构:
2.1.步骤:
1)项目创建完成后,执行create_dir.bat创建文件夹
2)用属性表配置项目的属性(可根据自己的需求自由修改定制)
3)在VS2017解决方案中创建虚拟文件夹,添加现有文件
这样你创建的实际文件夹和虚拟的文件夹对应,方便编写调试。
2.2.原文件夹结构:
source/repos/Project1/ 解决方案文件夹
./sln: 解决方案文件,平常打开项目就用它,文本文件
./.vs 存储用户在解决方案中工作配置 注1
./Debug 配置对应的生成目录 编译的中间文件夹保存初步编译文件
--a.obj 日志文件
--Project1.obj 日志文件
--vc141.idb 最小生成使用文件夹-只编译有变换的代码
--vc141.pdb cpp文件都调用编译器生成一个.obj文件
./Release 配置对应的生成目录
./Release_Debug 配置对应的生成目录
./x64 配置对应的生成目录
./Project1 项目文件夹
--a.cpp
--a.h
--main.cpp 注2
//配置文件
--Project1.vcxproj
--Project1.vcxproj.filters 项目筛选器(虚拟文件夹)保存filters信息 xml文本
--project1.vcxproj.user 项目用户配置文件 xml文本
注1:
具体包括VS关闭前最后的窗口布局、最后打开的选项卡/操作记录/文件文档
某些自定义配置/开发环境、调试断点等这类设置信息和状态
注2:
所有在cpp文件下的变量定义和函数定义都是全局的,整个项目都共享(只是项目,不是解决方案)
2.3.修改项目文件夹:
source/repos/TcyVisionSystem/解决方案文件夹
./vs
./Data //配置文件(VS虚拟+实际文件夹)
tcy_custom_customization.pros
tcy_cv.props
tcy_cv_64_debug.props
tcy_cv_64_release.props
tcy_qt_release_props
./Include //(VS虚拟+实际文件夹)
./Intermediate //中间过程存储.obj格式的目标文件等 (VS虚拟+实际文件夹)注1
./Lib //(VS虚拟+实际文件夹)第三方库文件
./Output //(实际文件夹)存储最终生成的.exe,.dll,.pdb,.itk文件 x64/Debug,Release
./Resource //(VS虚拟+实际文件夹)
./Resource/Data //(VS虚拟+实际文件夹)
./Resource/Icon //(VS虚拟+实际文件夹)
./Resource/Picture//(VS虚拟+实际文件夹)
./TcyHalcon //项目1(VS创建)(VS虚拟+实际文件夹)存放配置文件及头文件cpp文件 注3
./TcyHalcon/TcyHalcon.vcxproj
./TcyHalcon/TcyHalcon.vcxproj.filters
./TcyHalcon/TcyHalcon.vcxproj.user
./TcyHalcon/xxx.h //头文件
./TcyHalcon/xxx.cpp //用户代码
./TcyHalcon/main.cpp
...... //创建其他虚拟文件夹
./TcyVisionUI //项目2(VS创建)(VS虚拟+实际文件夹)
......
./Test //(VS虚拟+实际文件夹)存放测试程序 注2
./Test/TcyHalcon //项目1(VS创建)(VS虚拟+实际文件夹)
./Test/TcyVisionUI
./create_dir.bat //创建文件夹
./TcyVisionSystem.sln
注1:
int文件夹下有debug,release文件夹
设置 项目右键-属性-常规-中间目录,添加宏 $(SolutionDir)Int\$(Configuration)\$(ProjectName)\
注2:添加虚拟文件夹:右键项目(或虚拟文件夹如"源文件")-添加-新建筛选项
结果在当前目录下创建子文件夹;若要移动文件用鼠标拖动文件或点击添加
注3:
本方案把头文件和用户代码放在项目文件夹下,将其他编译输出资源文件,测试文件放在其他文件夹中(硬盘中)
这样的目的是后续添加修改变动相对来说比较小且方便,当然你也可以分开存放后续比较麻烦。若要这样做参考
https://blog.csdn.net/logic9169/article/details/105640842/
注意:
不建议直接配置项目属性,而应先编写相应的属性文件xxx.pros,这样后续需要什么只需添加相应的属性表即可。
项目建议独立,一个用途一个项目,减少项目间的耦合性,便以使用修改调试。
3.备注:
3.1.create_dir.bat
::创建输出目录 tcy 2021/4/4
echo off
set "cur_path=%cd%"
echo 1.1cur_path=%cur_path%
set res=Resource\
set "lst_first=Data Output Intermediate Lib Include Resource Test"
set "res_sub=%res%Data %res%Icon %res%Picture"
set "lst=%lst_first% %res_sub%"
set "tmp=%cur_path%\%res_sub%"
(for %%a in (%lst%) do (
if not exist %cur_path%\%%a (mkdir %cur_path%\%%a)
))
::在Test文件夹中创建项目文件夹
dir /ad /b >tmp.txt
for /f "skip=1 delims=" %%a in ('findstr /vi "Data Include Lib Output Resource Test Intermediate" tmp.txt') do (
echo %%a
if not exist %cur_path%\Test\%%a (mkdir %cur_path%\Test\%%a)
)
del tmp.txt
3.2.tcy_qt_release.pros 测试配置文件
REM **************************************
REM qt release 拷贝dll到当前可执行文件目录:
REM 测试程序1:
REM **************************************
REM echo off
REM set qt_root=C:\Qt\Qt5.14.2\5.14.2\msvc2017_64
REM set "cur_path=C:\Users\Administrator\source\repos\TcyVisionSystem"
REM set "release_path=%cur_path%\Release"
REM set "win_path=%cur_path%\Release\plugins\platforms"
REM echo on
REM echo cur_path=%cur_path%
REM echo release_path=%release_path%
REM echo win_path=%win_path%
REM echo off
REM if not exist %win_path% mkdir %win_path%
REM echo on
REM copy %qt_root%\bin\Qt5Widgets.dll %release_path%\
REM copy %qt_root%\bin\Qt5Gui.dll %release_path%\
REM copy %qt_root%\bin\Qt5Core.dll %release_path%\
REM copy %qt_root%\plugins\platforms\qwindows.dll %win_path%\
REM ************************************
REM tcy_qt.props
REM 生成前事件代码:
REM ************************************
set qt_root=$(QtInstallDir)
set release_path=$(SolutionDir)$(Platform)\$(Configuration)
set "win_path=$(SolutionDir)$(Platform)\$(Configuration)\plugins\platforms"
if not exist %win_path% mkdir %win_path%
echo on
copy %qt_root%\bin\Qt5Widgets.dll %release_path%\
copy %qt_root%\bin\Qt5Gui.dll %release_path%\
copy %qt_root%\bin\Qt5Core.dll %release_path%\
copy %qt_root%\plugins\platforms\qwindows.dll %win_path%\
3.3.tcy_custom_customization.pros
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<OutDir>$(SolutionDir)output\$(Configuration)\</OutDir>
<IntDir>$(SolutionDir)Intermediate\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup />
<ItemGroup />
</Project>
3.4.tcy_cv.props
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<IncludePath>$(IncludePath)</IncludePath>
</PropertyGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>C:\ProgramData\Anaconda3\include;$(HALCONROOT)\include;$(HALCONROOT)\include\halconcpp;D:\opencv\build\include;D:\catch;D:\pybind11-master\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<AdditionalLibraryDirectories>C:\ProgramData\Anaconda3\libs;C:\Program Files\MVTec\HALCON-18.11-Progress\lib\x64-win64;D:\opencv\build\x64\vc15\lib</AdditionalLibraryDirectories>
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup />
</Project>
3.5.tcy_cv_64_debug.props
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup>
<Link>
<AdditionalDependencies>opencv_world451d.lib;halcond.lib;halconcppd.lib;python3d.lib;python38d.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup />
</Project>
3.6.tcy_cv_64_release.props
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup>
<Link>
<AdditionalDependencies>opencv_world451.lib;halcon.lib;halconcpp.lib;python3.lib;python38.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup />
</Project>