一、概述
我还在用VS2019,没用更新的版本。
我做了5年以上Linux下的C、C++(gcc)开发,也做了5年以上Windows下的C++ MFC(VS)开发。我也做过3年以上Python开发(Python 3.6以上,Linux、Windows都做)。
VS中,方案Solution文件是.sln,方案Project下的项目文件是.vcxproj,用C++项目举例。
.sln文件所在目录为SolutionDir,.vcxproj所在目录为ProjectDir。
本文配置的设置,在一个多DLL C++项目+EXE项目相互依赖的方案中,在Win32及x64平台都验证通过了。
二、配置属性
1、常规页内容
配置属性界面,右击某个项目选“属性”,打开后界面通常这样:
标红框是配置Configuraition,一般还没发布就选Debug吧。
标红2框平台Platform,如果是以前老的机器,或者老的项目,选Win32,新的,选x64。分别对应32位、64位x86机器。
本文以Win32为图例。x64也类似的。
配置属性、标红4常规页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 输出目录,即OutDir,$(SolutionDir)/Bin/,如果SolutionDir下有一个Bin子目录。DLL和.exe一起也放在Bin下。
- 中间目录,即IntDir,填$(Platform)/$(Configuration)/,这里的Platform目录在ProjectDir下,即完整意思是$(ProjectDir)/$(Platform)/$(Configuration)/。
- 目标文件名,$(ProjectName)D,尾缀带个D,以示为Debug版本对应的目标文件名。这个$(ProjectName)D是不带.exe、.dll等文件扩展名后缀的。
- 配置类型,动态库(.dll)。因为该项目是DLL库。
剩下其它的都为VS自动默认设置就可以了。
2、高级页内容
高级页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 使用调试库,选是。
- MFC的使用,选“在共享 DLL 中使用 MFC”,没选静态啊啥的。
- 字符集,即CharSet,因为要支持中文汉字,因此选“使用多字节字符集”,没选Unicode啥的。
- 剩下其它的都为VS自动默认设置就可以了。
3、调试页内容
调试页中各项内容,都为VS自动默认设置就可以了。
4、VC++目录页内容
VC++目录页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 包含目录,$(VC_IncludePath);$(WindowsSDK_IncludePath);..\..\CommonLib\include;C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_86\include。
其中,$(VC_IncludePath);$(WindowsSDK_IncludePath)是VS自动给的。
..\..\CommonLib\include,是我的公共SDK或第三方SDK库代码目录。无此类SDK库的,不需要这个。
而C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_86\include,是因为要使用Python+C++混编,需要Python包含目录环境。不是Python+C++混编的项目,不需要这个。并且,这是Win32平台,如果x64平台,需要指定为C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_64\include。
- 库目录,$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_86\libs。
$(NETFXKitsDir)Lib\um应该是VS自动加的,我没加过,是DotNet(.NET framework SDK)相关的库,通常在这里,
C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\Lib\um\
C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_86\libs,是因为要使用Python+C++混编,需要Python库目录环境。不是Python+C++混编的项目,不需要这个。并且,这是Win32平台,如果x64平台,需要指定为C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_64\libs。
此页中的其它设置中_x86字样不用处理,是Win32平台时VS自动选的,如果x64平台,VS会自动选_x64字样的设置值。
剩下其它的都为VS自动默认设置就可以了。
5、C/C++的常规页内容
C/C++的常规页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 附加包含目录,../Include;../Include/GridCtrl;%(AdditionalIncludeDirectories)。
因为该项目的目录组织是这样的:
也就是提供给这个库外部的接口头文件,在Include子目录,实现的源文件、内部文件,放在Src子目录下,Src子目录就是ProjectDir。
所以附加包含目录有../Include。
至于../Include/GridCtrl这样类似的,如实际有,则加,没有就省略。
剩下其它的都为VS自动默认设置就可以了。
6、C/C++的优化页内容
C/C++的优化页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
优化页中各项内容,都为VS自动默认设置就可以了。作为一个Debug配置,这些设置内容基本上我没动。
7、C/C++的预处理器页内容
C/C++的预处理器页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 预处理器定义,我填了WIN32;_WINDOWS;_DEBUG;_AFXDLL;PYAPP_DLL;%(PreprocessorDefinitions)。
WIN32,可以不加。我那是因为一个老项目,#define了一个WIN32,很多代码用它处理了,懒得清理,就没删它。
通常x86 Win32平台,VS自己定义了_WIN32,因此WIN32不用特意定义。另外,x64平台时,对应的VS自己定义了_WIN64,并且注意,并且同时定义了_WIN32。
PYAPP_DLL,也是因为老项目的接口头文件中用到了,懒得清理,就没删它。
至于_WINDOWS;_DEBUG;_AFXDLL这几个,就放在吧。_AFXDLL和选了在共享 DLL 中使用 MFC有相关性,但确切的因为过去有些日子了,我记不清了,就留着吧。
剩下其它的都为VS自动默认设置就可以了。
8、C/C++的代码生成页内容
C/C++的代码生成页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 运行库,设置为多线程调试 DLL (/MDd)。
剩下其它的都为VS自动默认设置就可以了。
9、C/C++的语言页内容
C/C++的语言页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
语言页中各项内容,都为VS自动默认设置就可以了。
10、C/C++的预编译头页内容
C/C++的预编译头页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 预编译头,通常选“使用”。
- 预编译头文件,如果是老式的StdAfx.h.cpp,那就填它。否则填你用的实际预编译头。
其实吧,有些项目你指定了预编译头“使用”,build时会出问题,那就到这里来改成不使用。
剩下其它的都为VS自动默认设置就可以了。
11、C/C++的输出文件页及其它页内容
C/C++的输出文件页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
输出文件页及其它页中各项内容,都为VS自动默认设置就可以了。
12、链接器的常规页内容
链接器的常规页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 输出文件,填$(OutDir)/$(TargetName)$(TargetExt),这些是VS自动给的。
OutDir是前面说的,输出目录,即OutDir,$(SolutionDir)/Bin/。
TargetName是前面说的,目标文件名,$(ProjectName)D。
TargetExt,本例中就是.dll。
- 附加库目录,填$(SolutionDir)/Lib;%(AdditionalLibraryDirectories)。
因为方案目录下建了个Lib/子目录,build时,所有编译出的库的*.lib都会被放到这个子目录下。
- 链接库依赖项,选是。这是VS自动给的。
剩下其它的都为VS自动默认设置就可以了。
13、链接器的输入页内容
链接器的输入页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 附加依赖项,./HtmlHelpWin32/htmlhelp.lib;%(AdditionalDependencies),填你用到的额外库。
比如HtmlHelp.lib是个例子。而且Win32、Win64库版本要各自制定。
- 模块定义文件,填Win32.def。
里面是库需要export出的函数、类方法的符号。
像这些内容。
VS这方面很烦的。Linux下gcc不需要搞这些。
另外,这个类似Win32.def文件是编Win32平台时用的,如果是Win64平台,需要另外再整一个Win64.def文件。你说VS是不是很烦吧。
剩下其它的都为VS自动默认设置就可以了。
13、链接器的清单文件页内容
链接器的清单文件页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
清单文件页及其它页中各项内容,都为VS自动默认设置就可以了。
13、链接器的调试页内容
链接器的调试页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
- 生产调试信息,选生成调试信息 (/DEBUG)。
剩下其它的都为VS自动默认设置就可以了。
13、链接器的高级页内容
链接器的高级页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
高级页1
高级页2
- 导入库,填$(SolutionDir)/Lib/$(TargetName).lib。
因为前面提到过附加库目录$(SolutionDir)/Lib,方案目录下建了个Lib/子目录,build时,所有编译出的库的*.lib都会被放到这个子目录下。所以链接时,从该子目录下导入。
剩下其它的都为VS自动默认设置就可以了。
13、链接器的其它页内容
链接器的其它页中各项的内容,如果是库项目(Lib、DLL),我习惯填为如下。
其它页中各项内容,都为VS自动默认设置就可以了。
13、其它页内容
截图红框里其它页中各项的内容,就VS自动设置的就行,我不经常设置,这些关系都不太大,不会引起编译、链接、build失败。
三、多项目时的依赖设置
一个方案包括多个DLL库项目,加上一个EXE可执行启动项目,那么需要设置依赖。
右击方案,点项目依赖项或生成顺序,在弹出的界面中可以勾选设置。
四、x64平台项目的设置
点击配置管理器,里面可以新建x64配置,然后可以选从现有的Win32作为模板建立,然后稍微修改就行。
其它的和Win32的配置设置上的差异,前面差不多都提到过了。
剩下的代码处理差异,那就是另外回事情了。