日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VS项目属性的一些配置项的总结(持续增加。。。)

發(fā)布時(shí)間:2023/12/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS项目属性的一些配置项的总结(持续增加。。。) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先,解決方案和項(xiàng)目文件夾包含關(guān)系(c++項(xiàng)目):

VS解決方案和各個(gè)項(xiàng)目文件夾以及解決方案和各個(gè)項(xiàng)目對應(yīng)的配置文件包含關(guān)系:

????假設(shè)新建一個(gè)項(xiàng)目ssyy,解決方案起名fangan,注意解決方案包括項(xiàng)目,此時(shí)生成的最外層目錄為fangan代表整個(gè)解決方案的內(nèi)容都在這個(gè)文件夾內(nèi)。在這個(gè)fangan文件夾內(nèi)包含有fangan.sln的解決方案配置文件和一個(gè)ssyy文件夾,ssyy文件夾代表整個(gè)ssyy項(xiàng)目的所有內(nèi)容都在這個(gè)文件夾內(nèi),這個(gè)文件夾內(nèi)含有ssyy.vcproj的項(xiàng)目配置文件和.h頭文件以及.cpp源文件。如果在fangan解決方案下再建立一個(gè)新項(xiàng)目名為ssyy2,則會(huì)在fangan文件夾下生成一個(gè)ssyy2文件夾存放ssyy2項(xiàng)目的所有內(nèi)容。

由上面敘述可以總結(jié)出,管理器(解決方案或項(xiàng)目)都會(huì)對應(yīng)一個(gè)總的文件夾,這個(gè)管理器文件夾下存放本管理器的配置文件以及子管理器。比如,解決方案是個(gè)管理器,它的文件夾下含有.sln配置文件以及子管理器ssyy項(xiàng)目和子管理器ssyy2項(xiàng)目。

另外,默認(rèn)情況下,項(xiàng)目屬性設(shè)置的目錄起點(diǎn)為項(xiàng)目配置文件所在位置,實(shí)際上就是項(xiàng)目頭文件和源文件所在位置。

補(bǔ)充:vs中建立默認(rèn)的C#項(xiàng)目和建立默認(rèn)的C++項(xiàng)目生成的目錄結(jié)構(gòu)是不一樣的。如果是C++項(xiàng)目,則解決方案總文件夾下就只包含解決方案配置文件sln和一個(gè)項(xiàng)目總文件夾和一個(gè)Debug文件夾以及一個(gè)Release文件夾(共四個(gè)東東,其中Debug和Release文件夾中存放最終生成的結(jié)果exe或dll,要注意如果不使用Release生成,則不存在Release文件夾),而項(xiàng)目總文件夾下包含C++源文件頭文件、項(xiàng)目配置文件和一個(gè)Debug文件夾以及一個(gè)Release文件夾(一定要注意,此處的Debug和Release文件夾僅僅存放中間編譯結(jié)果obj,不存放exe和dll之類的東西。如果不使用Release編譯,則沒有對應(yīng)的Release文件夾)。


其次,常用項(xiàng)目屬性系統(tǒng)配置變量關(guān)系:

如果我們建立一個(gè)默認(rèn)的vc項(xiàng)目ssyy,

他的默認(rèn)“常規(guī)“欄目中:

????“輸出目錄”為$(SolutionDir)$(ConfigurationName),所以調(diào)試時(shí)會(huì)在解決方案文件夾下建立一個(gè)debug(ConfigurationName的值為debug)文件夾,并在此文件夾下生成?ssyy.lik鏈接器?和ssyy.exe文件?。

????“中間目錄”為$(ConfigurationName),所以會(huì)在ssyy項(xiàng)目文件夾下(即ssyy.vcproj的項(xiàng)目配置文件所在位置)建立一個(gè)debug文件夾,并在該文件夾下生成ssyy.obj二進(jìn)制文件。


?“鏈接器”欄目下的“常規(guī)”選項(xiàng)下的:

????“輸出文件”選項(xiàng)為$(OutDir)\$(ProjectName).exe,其中$(OutDir)就已經(jīng)在“常規(guī)”欄目的“輸出目錄”選項(xiàng)賦值了。【所以$(OutDir)的值是在“輸出目錄”屬性中定義的】。


??????? 另外,經(jīng)過實(shí)際測試,發(fā)現(xiàn)“輸出目錄”屬性只能起到對$(OutDir)系統(tǒng)變量賦值的作用,和“改變生成的.exe文件存放位置”沒任何關(guān)系。也就是說,如果“輸出目錄”中設(shè)置的$(OutDir)值在C盤,而“輸出文件”中設(shè)置輸出文件的位置為D盤,最終生成的exe文件會(huì)在D盤,“輸出文件”屬性才決定輸出exe文件的位置。

??????? 而$(TargetDir)的值是在生成exe文件后自動(dòng)賦予值為exe文件所在位置。所以可以說,“輸出文件”最終決定exe文件所在的位置,也最終決定了$(TargetDir)的值,$(TargetPath)和$(TargetDir)的行為是類似的,此不贅述。

??????? 上面兩段說了這么多,總結(jié)就是,默認(rèn)情況下“輸出目錄”和“輸出文件”兩個(gè)屬性對應(yīng)的目錄是一樣的,這樣用著方便(當(dāng)然,輸出文件的值在輸出目錄的值的基礎(chǔ)上還包含有exe文件名)。如果兩個(gè)不一樣,則中間生成的鏈接器用的如xx.ilk和xx.pdb文件等在輸出目錄,而最終生成的xx.exe文件在“輸出文件”屬性設(shè)置的目錄中。

另外,上面兩段話可以總結(jié)出,當(dāng)調(diào)試程序時(shí),系統(tǒng)變量$(OutDir)的值是最先確定的,而$(TargetDir)和$(TargetPath)的值是在exe文件生成后才確定的。也就是說系統(tǒng)變量$(OutDir)的值由VS項(xiàng)目的“輸出目錄”屬性決定,而$(TargetDir)和$(TargetPath)的值由VS項(xiàng)目的“輸出文件”屬性決定。即設(shè)置了VS的“輸出目錄”屬性就相當(dāng)于設(shè)置了$(OutDir)的值,“輸出目錄”是界面上的提示用于接收用戶輸入的配置信息,然后把這個(gè)具體的配置信息存入系統(tǒng)內(nèi)容的變量$(OutDir)中。

其它常用的屬性還有,“調(diào)試”欄目中的“工作目錄”項(xiàng),這個(gè)屬性默認(rèn)情況下是空的,但表示工作目錄是工程目錄,也就是工程配置文件ssyy.vcproj所在目錄。工作目錄表示進(jìn)行某項(xiàng)操作的目的目錄,會(huì)隨著OpenFileDialogSaveFileDialog等對象所確定的目錄而改變。“工作目錄”屬性作用是程序運(yùn)行后唯一識別的默認(rèn)目錄,即工作后只認(rèn)識這個(gè)目錄,工作目錄這個(gè)名字描述的就很形象,(可以將所依賴的libdll庫文件所在目錄設(shè)為工作目錄,但一般是把lib放在解決方案下的Lib目錄中,把dll放在解決方案下的Bin目錄中),例如程序運(yùn)行過程中生成一個(gè)txt文本文件,如果在創(chuàng)建文件過程中未指定絕對路徑,只指定創(chuàng)建文件的文件名,那么這個(gè)文本文件默認(rèn)就會(huì)建立在工作目錄中,當(dāng)然讀取一些配置文件也在工作目錄中查找,但要說明一下,生成的exe文件跟工作目錄沒任何關(guān)系,也不會(huì)放在工作目錄中。總的來說,工作目錄就是程序運(yùn)行過程中默認(rèn)讀取的目錄。對于dll,如果是程序運(yùn)行前就進(jìn)入內(nèi)存有點(diǎn)像靜態(tài)鏈接那樣,此時(shí)dll就可以放入exe所在的執(zhí)行目錄,如果dll是運(yùn)行中動(dòng)態(tài)加載的一般放在工作目錄,比如插件就放在工作目錄。即工作目錄就是運(yùn)行期間唯一能識別的默認(rèn)目錄,工作目錄在代碼中用GetCurrentDirectory之類的函數(shù)獲取,具體代碼間最下面的附1。工作目錄與執(zhí)行目錄可以不同,例如一個(gè)人住在北京,但他的工作地點(diǎn)不一定在北京,可能在天津。

對工作目錄的補(bǔ)充:vs中工作目錄的設(shè)置是給調(diào)試用的,也即你啟動(dòng)調(diào)試后,啟動(dòng)一個(gè)新進(jìn)程,自動(dòng)把這個(gè)新進(jìn)程的工作目錄設(shè)置為vs項(xiàng)目屬性中的工作目錄,然后新進(jìn)程啟動(dòng)對應(yīng)的exe程序。但是如果不使用vs的調(diào)試啟動(dòng)exe,而是直接雙擊exe文件啟動(dòng)一個(gè)新進(jìn)程時(shí),會(huì)自動(dòng)把這個(gè)新進(jìn)程的工作目錄設(shè)置為exe文件所在的目錄,這是和vs啟動(dòng)調(diào)試不同的地方。所以如果發(fā)布的時(shí)候不把工作目錄內(nèi)的東西拷到exe所在的目錄內(nèi),就會(huì)運(yùn)行出錯(cuò),因?yàn)榇藭r(shí)工作目錄不再是vs中設(shè)置的了,而是exe文件所在的目錄。最后,說一下,vs中默認(rèn)的vc++工程的工作目錄項(xiàng)目的值是空的,代表默認(rèn)是vs工程所在目錄即.vcproj文件所在目錄,c#工程默認(rèn)沒測試,估計(jì)和vc的一樣。】

【同樣在調(diào)試選項(xiàng)下的和工作目錄選項(xiàng)同一級的選項(xiàng)“命令”選項(xiàng)是設(shè)置,使用調(diào)試時(shí),從哪里啟動(dòng)exe文件,因?yàn)橐话闵傻膃xe放在bin目錄下的debug或release目錄下,所以命令選項(xiàng)一般為“Bin\$(Configuration)\$(ProjectName).exe”,默認(rèn)也是這個(gè)值,當(dāng)然可以更改,但此時(shí)意味著調(diào)試狀態(tài)下啟動(dòng)的exe為“命令”選項(xiàng)中設(shè)置的exe文件,而不是默認(rèn)的bin目錄下的debug或release下的exe文件了。最后說一下,上面所說的“調(diào)試”是指vs下啟動(dòng)exe,包括debug模式和release模式,不要把調(diào)試就理解為只有debug模式。】

?

?“調(diào)試”欄目中的“命令(Command)”屬性項(xiàng),【這個(gè)屬性表示調(diào)試器要啟動(dòng)的exe文件的全名】,包括路徑名,默認(rèn)為$(TargetPath),而TargetPath就表示目標(biāo)輸出文件的全路徑名,所以一般情況下它代表的值就等于“輸出文件”屬性代表的值。當(dāng)然你也可以人為的更改“命令”屬性的值,比如更改為c:\aa.exe,而“輸出文件”的值為c:\bb.exe,此時(shí)如果輸出文件所在目錄沒有aa.exe的話(因鏈接器只生成bb.exe而根本不會(huì)生成aa.exe),調(diào)試器就不能啟動(dòng)aa.exe,提示找不到aa.exe。當(dāng)然如果目錄中已經(jīng)有aa.exe文件(可以強(qiáng)制賦值一個(gè)bb.exe文件的副本并命名為aa.exe),此時(shí)調(diào)試器就可以正常調(diào)試通過。

“鏈接器”欄目下的“輸入”選項(xiàng)下的“附加依賴項(xiàng)”項(xiàng)。此項(xiàng)是設(shè)置程序鏈接時(shí)使用的靜態(tài)庫。相當(dāng)于鏈接已經(jīng)編譯好了的“代碼”。由此我們可以簡單的認(rèn)為這些庫就相當(dāng)于我們自己寫的.cpp文件,只不過這些庫是編譯好了的.cpp而已(這里只需要庫名稱即可,搜索路徑在其他地方設(shè)置)。

“附加依賴性的設(shè)置”等同于在代碼中寫“#pragma comment(lib, "庫名稱.lib") ”語句,如果使用相對路徑則如下:

#pragma comment(lib,"..\\debug\\TestLib.lib");其中的反斜杠要用雙反斜杠,因?yàn)樗浅绦蚪忉尩碾p引號包括的字符串,需要轉(zhuǎn)義一下,要區(qū)別include,#include "..\TestVideoApplication.h"中并不是由程序解釋的字符串,所以不用轉(zhuǎn)義

?

下面舉一個(gè)多項(xiàng)目例子(vc++例子):(轉(zhuǎn)自:http://blog.163.com/zhang_bo1983/blog/static/16992223020123753334981/)

解決方案與項(xiàng)目:
從VC6之后VC系列就使用解決方案(Solution)來替代原來的工作空間,用于組織和管理多個(gè)相關(guān)的項(xiàng)目(Project)。
文章首先演示一個(gè)虛擬的解決方案和我們期望得到的目錄結(jié)構(gòu),然后使用VC2008的項(xiàng)目設(shè)置功能來一步一步達(dá)到我們的需求。
虛擬解決方案:
該虛擬解決方案名為GMA,包含一個(gè)動(dòng)態(tài)鏈接庫項(xiàng)目ChocolateMilk和一個(gè)應(yīng)用程序項(xiàng)目PureMilk,需要使用一個(gè)第三方庫log4cxx(Apache log4j的C++移植版本,用于日志輸出)。【注意這個(gè)例子中ChocolateMilk項(xiàng)目只生成一個(gè)dll,PureMilk只生成一個(gè)exe】
log4cxx是以動(dòng)態(tài)庫的方式編譯的,所以我們需要它的3樣?xùn)|西,分別是頭文件,導(dǎo)入庫(log4cxx.lib, log4cxxd.lib)和動(dòng)態(tài)鏈接庫(log4cxx.dll)。
假設(shè)我們期望的目錄結(jié)構(gòu)如下圖:

1. GMA是解決方案目錄
2. PureMilk和ChocolateMilk是項(xiàng)目目錄
3.?Lib目錄用于存放導(dǎo)入庫或者靜態(tài)庫(包括第三方庫和自己的項(xiàng)目)
4.?Include用于存放三方庫的頭文件(可以看出第三方庫所有內(nèi)容分布在Lib、Include和Bin中)
5. Bin目錄存放所有動(dòng)態(tài)鏈接庫和執(zhí)行檔,包括自己的產(chǎn)出和第三方庫,區(qū)分Release和Debug兩個(gè)版本。另外,程序運(yùn)行過程中需要外部的數(shù)據(jù)文件和啟動(dòng)時(shí)需要的配置文件等等都可放于該目錄
6. Temp用于存放臨時(shí)生成文件,其中Compile存放編譯器編譯時(shí)生成的obj文件,Link存放鏈接器的輸出文件。

7.PureMilk和ChocoliteMilk兩個(gè)項(xiàng)目的頭文件和源文件位置不要?jiǎng)?#xff0c;任然在各自的項(xiàng)目文件夾內(nèi)。
上面目錄結(jié)構(gòu)清晰,一面了然,當(dāng)我們的程序需要制作安裝包或者要打包源碼
發(fā)布的時(shí)候,它能夠使得我們生活變得更容易^_^
制作安裝包時(shí)我們只需將“/GMA/Bin/Release/”目錄下的所有文件打包。
發(fā)布和轉(zhuǎn)移源碼的時(shí)候我們可以打包除了Temp目錄以外“/GMA/”下面的所有文件和目錄(如果不需要執(zhí)行檔,也可不包括Bin)。

我們的需求是明確的,可是VC 2008(VS2008)并不會(huì)自動(dòng)為我們做好上面所有的事情。不過我們并不需要編寫復(fù)雜的編譯腳本(makefile),只需要簡單的修改項(xiàng)目的缺省設(shè)置即可。
我們需要VC(VS)為我們做的事情包括:
1.使用“/GMA/Temp/Compile/”作為項(xiàng)目編譯時(shí)使用的中間目錄
2.使用“/GMA/Temp/Link/”作為項(xiàng)目鏈接的輸出目錄
3.當(dāng)項(xiàng)目是應(yīng)用程序時(shí),在構(gòu)建結(jié)束后拷貝執(zhí)行文件到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,當(dāng)項(xiàng)目是動(dòng)態(tài)鏈接庫時(shí),除了拷貝dll到Bin,還拷貝導(dǎo)入庫到“/GMA/Lib/”
4.當(dāng)項(xiàng)目是應(yīng)用程序時(shí),調(diào)試時(shí)運(yùn)行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的執(zhí)行文件,并以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”為工作目錄
首先看一下項(xiàng)目設(shè)置中可以使用的宏,常用的有:


ConfigurationName

配置名字,通常是Debug或者Release

IntDir

編譯器使用的中間目錄,產(chǎn)出obj文件

OutDir

鏈接器使用的輸出目錄

ProjectDir

項(xiàng)目目錄

ProjectName

項(xiàng)目名字

SolutionDir

解決方案目錄

TargetDir

目標(biāo)輸出文件所在的目錄

TargetExt

目標(biāo)輸出的擴(kuò)展名

TargetFileName

目標(biāo)輸出文件名,包括擴(kuò)展名

TargetName

目標(biāo)輸出名,不包括擴(kuò)展名

TargetPath

目標(biāo)輸出文件的全路徑名

下圖是某一個(gè)工程所有設(shè)置的例子:


注意:從上圖可以看出,TargetDir指目標(biāo)目錄,是一個(gè)目錄。而TargetPath是目標(biāo)路徑,包括具體的文件名

?

下面開始進(jìn)行所舉例子的工程設(shè)置:

首先來設(shè)置ChocolateMilk:
1.使用“/GMA/Temp/Compile/”作為項(xiàng)目編譯時(shí)使用的中間目錄
2.使用“/GMA/Temp/Link/”作為項(xiàng)目鏈接的輸出目錄

注意高亮的部分,首先將配置改成All Configuration(全部配置),這樣可以讓我們同時(shí)修改Debug和Release的部分;
Output Directory(輸出目錄,鏈接器)欄位填入:
$(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)
Intermediate Directory(中間目錄,編譯器)欄位填入:
$(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)
3.構(gòu)建結(jié)束后拷貝動(dòng)態(tài)鏈接庫到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”,拷貝導(dǎo)入庫到“/GMA/Lib/”【這是因?yàn)槿舨辉O(shè)置,此時(shí)生成的dll和lib都在上面設(shè)置的輸出目錄中】
我們通常都會(huì)在Debug版本的輸出庫后面加上字母“d”以表示這是Debug版本,在Debug配置下,修改Import Library欄位:

VC可以讓我們設(shè)置構(gòu)建前后執(zhí)行的腳本程序,所以為了完成3,
我們需要寫構(gòu)建后執(zhí)行的腳本:

在Command Line中填入,Debug配置下:
copy $(TargetPath)?? ?$(SolutionDir)\Bin\$(ConfigurationName)\;
copy $(TargetDir)$(TargetName)d.lib??? $(SolutionDir)\Lib\;
Release配置下:
copy $(TargetPath)??? $(SolutionDir)\Bin\$(ConfigurationName)\;
copy $(TargetDir)$(TargetName).lib??? $(SolutionDir)\Lib\;
之所以要分別設(shè)置是因?yàn)閂C沒有表示導(dǎo)入庫的宏名字 -_-P
OK,到此為止,你就可以編譯ChocolateMilk項(xiàng)目試試是不是一切正常了,不過請確認(rèn)拷貝的目標(biāo)目錄事先建立好。

?

接下來我們設(shè)置應(yīng)用程序項(xiàng)目PureMilk:
1.使用“/GMA/Temp/Compile/”作為項(xiàng)目編譯時(shí)使用的中間目錄
2.使用“/GMA/Temp/Link/”作為項(xiàng)目鏈接的輸出目錄
首先將配置改成All Configuration(全部配置),這樣可以讓我們同時(shí)修改Debug和Release的部分;
Output Directory(輸出目錄,鏈接器)欄位填入:
$(SolutionDir)\Temp\Link\$(ProjectName)\$(ConfigurationName)
Intermediate Directory(中間目錄,編譯器)欄位填入:
$(SolutionDir)\Temp\Compile\$(ProjectName)\$(ConfigurationName)
3.構(gòu)建結(jié)束后拷貝執(zhí)行文件到“/GMA/Bin/Release/”或“/GMA/Bin/Debug/”
在Command Line中填入,All配置下:
copy $(TargetPath)?? ?$(SolutionDir)\Bin\$(ConfigurationName);
4.調(diào)試時(shí)運(yùn)行“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”下面的執(zhí)行文件,并以“/GMA/Bin/Debug/”或“/GMA/Bin/Release/”為工作目錄

Command欄位填入:$(SolutionDir)\Bin\$(ConfigurationName)\$(TargetFileName)
Working Directory欄位填入:$(SolutionDir)\Bin\$(ConfigurationName)\
這樣就大功告成了,現(xiàn)在你就可以編譯該執(zhí)行程序并進(jìn)行調(diào)試。

?

?

以vs2010為列,一些項(xiàng)目屬性截圖如下:

一、調(diào)試-》命令

如上圖設(shè)置,如果項(xiàng)目名稱為ss,則TargetName系統(tǒng)變量的值就是ss,TargetExt是擴(kuò)展名為exe,此時(shí)單擊調(diào)試按鈕(vs中的那個(gè)小三角形按鈕),會(huì)起動(dòng)圖中所示目錄下的ss-XX-.exe文件。

注意:調(diào)試欄目下的所有選項(xiàng)都是為了調(diào)試服務(wù)的,如果不用調(diào)試按鈕,這些選項(xiàng)就不起作用。至于VC++目錄以及C/C++欄目是給編譯器起作用的,無法是告訴編譯器在哪里尋找頭文件、庫文件之類的事情,或者設(shè)置其他一些編譯器選項(xiàng),此不贅述。

?

二、鏈接器-》常規(guī)-》輸出文件? (表示鏈接器生成的exe文件放在哪以及生成的exe文件名稱)

上圖中,如果項(xiàng)目名稱為ss,則連接器生成的exe為圖中所示目錄下的ss-YY-.exe文件。一般來說這個(gè)文件的位置和名稱要和上面所述的“命令”選項(xiàng)相同,以表示鏈接器生成的文件和調(diào)試時(shí)使用的文件一樣。(注意調(diào)試時(shí)如果沒有修改源代碼操作,單擊調(diào)試按鈕后,為了加快調(diào)試速度,并不會(huì)對程序重新鏈接,也即不會(huì)啟動(dòng)鏈接器)

經(jīng)過我做過的一些實(shí)驗(yàn)證明,如果已經(jīng)通過鏈接器生成了exe文件,手動(dòng)修改這個(gè)exe文件名,調(diào)試時(shí)只要將上圖所示的選項(xiàng)的文件名也進(jìn)行相應(yīng)的修改,一樣可以進(jìn)行調(diào)試并啟動(dòng)exe程序。

?

三、鏈接器-》輸入-》附加依賴項(xiàng)?? (此選項(xiàng)是設(shè)置程序鏈接時(shí)使用的靜態(tài)庫。相當(dāng)于鏈接已經(jīng)編譯好了的“代碼”。由此我們可以簡單的認(rèn)為這些庫就相當(dāng)于我們寫的.cpp文件,只不過這些庫是編譯好了的.cpp而已)

?

最后說一下,在開發(fā)過程中,究竟怎樣來讓 Visual Studio 鏈接這些 lib 及 dll 文件會(huì)比較好呢?

?因?yàn)?#xff0c;在調(diào)試 Visual Studio 2008 程序時(shí),經(jīng)常有一些動(dòng)態(tài)鏈接庫(即 dll 文件)需要加載到工程里,這樣才能依賴第三方庫進(jìn)行程序調(diào)試。

這些動(dòng)態(tài)鏈接庫,往往都是測試版本或是開發(fā)中的版本,或者會(huì)有若干個(gè)版本;這個(gè)時(shí)候,如果直接把 dll 所在目錄加到 PATH 里,則會(huì)有潛在沖突的危險(xiǎn);如果直接拷貝到 Visual Studio 的目錄下,假如測試工程太多,每次有新版本的動(dòng)態(tài)鏈接庫更新時(shí),你需要更新若干次,拷貝、粘貼苦不堪言。

總體上來說,有幾種方法可以改變 Visual Studio 的環(huán)境變量設(shè)置:

  • 直接添加到系統(tǒng)的 PATH 變量里

    這個(gè)方法最簡單,也最直接,但是壞處是會(huì)影響全局的 PATH 設(shè)置,尤其是你包含著大量測試用的 dll 時(shí)。

  • 在 Visual Studio 全局設(shè)置里,把 dll 所在目錄添加到 PATH 里:

    通過 Visual Studio 菜單 ==> 工具 ==> 選項(xiàng) ==> 項(xiàng)目和解決方案 ==> VC++目錄,在下拉框里選擇"可執(zhí)行文件",然后把 dll 所在路徑添加進(jìn)去。

  • 直接把所有 dll 拷貝到 Visual Studio 工程目錄下,或是拷貝到生成可執(zhí)行文件的文件夾(默認(rèn)情況下是 Debug 或 Release 目錄)下:

    這個(gè)方法也很簡單,但是當(dāng)你有若干個(gè)工程時(shí),你每次更新 SDK 及其 dll 文件,你就要把所有的工程都更新,這個(gè)不符合文件唯一性的工程性準(zhǔn)則。

  • 在調(diào)試程序時(shí),讓 Visual Studio 幫你切換當(dāng)前工作目錄到 dll 相應(yīng)的目錄下:

    在 Visual Studio ==> Project ==> Properties ==> Select Configuration ==> Configuration Properties ==> Debugging ==> Working directory 里填上 dll 所在目錄,這樣當(dāng)在調(diào)試程序時(shí),Visual Studio 會(huì)把當(dāng)前工作目錄切換到這個(gè)目錄下,從而會(huì)自動(dòng)讀取本目錄下的 dll 文件。

    這個(gè)方法的優(yōu)點(diǎn)很明顯,簡單!副作用也很明顯,在你切換了當(dāng)前工作目錄后,你可能會(huì)找不到程序的配置文件,在程序里寫的諸如"./config.ini"全部都找不到了;另外,你要把所有的 dll 都放到這個(gè)工作目錄里,否則一樣會(huì)提示說找不到 xxx.dll 的問題。

  • 最后一個(gè)方法,也是我認(rèn)為最好的一個(gè)方法,在 Visual Studio 工程屬性里把一個(gè)目錄臨時(shí)添加到 PATH 環(huán)境變量里:

    MSDN 上也有類似的介紹:How to: Set Environment Variables for Projects,方法很簡單,在 "工程屬性" ==> "調(diào)試" ==> "環(huán)境"里,添加類似如下所示的內(nèi)容:

    PATH=%PATH%;$(TargetDir)\DLLS

    這樣就可以把 $(TargetDir)\DLLS 臨時(shí)添加到該工程所屬的系統(tǒng) PATH 里。

  • 大家可以根據(jù)項(xiàng)目的實(shí)際情況,靈活選用以上方法。


    附1:vs(主要是.Net)中常用的各種類型的文件:

    附:*.ascx *.asax *.aspx.resx *.asax.resx是什么文件

    sln:解決方案文件,為解決方案資源管理器提供顯示管理文件的圖形接口所需的信息。?
    .csproj:項(xiàng)目文件,創(chuàng)建應(yīng)用程序所需的引用、數(shù)據(jù)連接、文件夾和文件的信息。?
    .aspx:Web 窗體頁由兩部分組成:視覺元素(HTML、服務(wù)器控件和靜態(tài)文本)和該頁的編程邏輯。Visual Studio 將這兩個(gè)組成部分分別存儲(chǔ)在一個(gè)單獨(dú)的文件中。視覺元素在.aspx 文件中創(chuàng)建。
    .aspx.cs:Web 窗體頁的編程邏輯位于一個(gè)單獨(dú)的類文件中,該文件稱作代碼隱藏類文件(.aspx.cs)。?
    .cs: 類模塊代碼文件。業(yè)務(wù)邏輯處理層的代碼。?
    .asax:Global.asax 文件(也叫做 ASP.NET 應(yīng)用程序文件)是一個(gè)可選的文件,該文件包含響應(yīng) ASP.NET 或 HTTP 模塊引發(fā)的應(yīng)用程序級別事件的代碼。
    .config:Web.config 文件向它們所在的目錄和所有子目錄提供配置信息。?
    .aspx.resx/.resx:資源文件,資源是在邏輯上由應(yīng)用程序部署的任何非可執(zhí)行數(shù)據(jù)。通過在資源文件中存儲(chǔ)數(shù)據(jù),無需重新編譯整個(gè)應(yīng)用程序即可更改數(shù)據(jù)。?
    .XSD:XML schema的一種.從DTD,XDR發(fā)展到XSD?
    .pdb:PDB(程序數(shù)據(jù)庫)文件保持著調(diào)試和項(xiàng)目狀態(tài)信息,從而可以對程序的調(diào)試配置進(jìn)行增量鏈接。?
    .suo:解決方案用戶選項(xiàng),記錄所有將與解決方案建立關(guān)聯(lián)的選項(xiàng),以便在每次打開時(shí),它都包含您所做的自定義設(shè)置。?
    .asmx:asmx 文件包含 WebService 處理指令,并用作 XML Web services 的可尋址入口點(diǎn)?
    .vsdisco(項(xiàng)目發(fā)現(xiàn))文件 基于 XML 的文件,它包含為 Web 服務(wù)提供發(fā)現(xiàn)信息的資源的鏈接 (URL)。?
    .htc:一個(gè)HTML文件,包含腳本和定義組件的一系列HTC特定元素.htc提供在腳本中implement組件的機(jī)制?

    .ascx 是用戶控件代碼文件
    .aspx webform html腳本文件
    .cs 是c#類文件)
    .vb 是vb類文件)
    .aspx.cs 和你的webform相關(guān)的后臺c#代碼文件,其實(shí)跟.cs是一樣的
    .aspx.vb 和你的webform相關(guān)的后臺VB代碼文件,其實(shí)跟.vb是一樣的
    web.config 配置文件
    .xml xml文件
    .css 樣式表文件

    附2.顯示行號

    菜單欄點(diǎn)擊工具-->選項(xiàng)-->文本編輯器-->C/C++,在右側(cè)“顯示”處選擇行號。


    ------------------------------------------------------------------------------------------------------------------------------------

    from:https://blog.csdn.net/lp310018931/article/details/49110069

    首先,我們一般不會(huì)修改解決方案的屬性,而是設(shè)置每個(gè)項(xiàng)目各自的屬性.

    接著上一篇文章,我們來看看我們應(yīng)該怎樣來設(shè)置各項(xiàng)目的項(xiàng)目屬性更好:

    我們以NYOJ_001項(xiàng)目的Debug版的設(shè)置為例:

    在常規(guī)選項(xiàng)里,我們一般會(huì)設(shè)置輸出目錄(即生成.exe文件的目錄),中間目錄(即中間文件的目錄)。當(dāng)然你也可以在這里設(shè)置生成的.exe文件的文件名甚至擴(kuò)展名等。

    如下圖所示:


    一般設(shè)置如下的目錄:如果不記得某個(gè)宏變量的值,可以點(diǎn)擊“宏(M)>>”來查看。


    既然我們修改了輸出文件的目錄,那我們也必須修改我們的調(diào)試目錄,不然就無法調(diào)試了。不信你運(yùn)行一下試試,雖然編譯通過了,但并沒像你想的那樣出現(xiàn)控制臺的“黑窗口”,原因就是我們沒有修改調(diào)試目錄:

    將調(diào)試目錄修改為$(OutDir)就可以了,$(OutDir)就是我們之前在常規(guī)里設(shè)置的輸出文件的目錄:

    這里面的命令參數(shù)一項(xiàng)也是比較重要的,如果你開發(fā)的是一個(gè)帶有命令行參數(shù)的項(xiàng)目,你調(diào)試的時(shí)候就可以在這里設(shè)置傳給程序的命令行參數(shù)來進(jìn)行調(diào)試了。你是否還記得你運(yùn)行一個(gè)帶有命令行參數(shù)的程序時(shí)是出現(xiàn)一個(gè)黑框框然后馬上就消失了,什么也不會(huì)做,除非你是將該程序拖到命令提示符下運(yùn)行。


    這些設(shè)置完后,可以先編譯運(yùn)行一下程序,結(jié)果如下所示:


    程序可以正常調(diào)試,還會(huì)在解決方案的根目錄下生成我們設(shè)置的輸出文件的目錄:Win32\Debug\Bin,生成的.exe文件就在該目錄下。還有中間文件目錄:Win32\Debug\XXX,里面放的都是生成的中間文件。如果你的這個(gè)項(xiàng)目里用到了其他的庫,你還需要像下面這樣設(shè)置你的項(xiàng)目的附加包含目錄和附加庫目錄:前都是設(shè)置其他庫的.h頭文件的目錄,一般放在庫的include文件夾下。后者是設(shè)置其他庫的lib以及.dll鏈接庫的目錄,一般放在庫的lib下。如下:




    最后你還必須設(shè)置項(xiàng)目的附加依賴項(xiàng)的值:一般設(shè)置的就是xx.lib靜態(tài)鏈接庫的名稱


    好了,所有必須設(shè)置的都已經(jīng)設(shè)置完成了。


    下面還有一個(gè)非常有用的設(shè)置,我們知道當(dāng)我們的程序使用在其他的庫的dll文件時(shí),在程序的當(dāng)前目錄或環(huán)境變量指定的目錄中必須能夠找得到這些.dll文件,即現(xiàn)在我們打開.exe文件所在的Bin文件夾,雙擊運(yùn)行程序,除非你設(shè)置了所依賴的dll的環(huán)境變量,否則程序仍然無法運(yùn)行,因?yàn)槌绦驘o法找到dll模塊。你可以手動(dòng)把這些.dll拷貝到.exe文件所在的文件夾,但現(xiàn)在有一個(gè)更好的辦法,如下圖:


    我們可以在上面的命令行中填寫我們在重新生成完程序后,執(zhí)行的命令。我們可以在這里使用copy命令,來將程序需要的.dll文件自動(dòng)拷貝到.exe文件所在的目錄。當(dāng)然,在這里你可以做更多的事情,比如如果你的程序需要讀取配置文件,你也可以把配置文件拷貝過來等。


    最后,把配置由Debug改變Release再將Release下的所有這些設(shè)置重新設(shè)置成Debug相同的就可以了。


    路徑推薦使用編譯器提供給我們的宏變量,而盡量不要使用絕對的名稱,這樣程序更具有移植性。例如,如果某外部庫的目錄為Win32\Debug與Win32\Release或Win64\Debu與Win64\Release。這樣我們使用$(Platform)\$(Configuration)進(jìn)行設(shè)置的時(shí)候就不需要再去管什么平臺以及是Debug還是Release版本。因?yàn)榫幾g器會(huì)自動(dòng)為我們切換,當(dāng)選擇Debug進(jìn)行編譯時(shí),編譯器會(huì)自動(dòng)鏈接到Debug版本,當(dāng)選擇Release進(jìn)行編譯時(shí),會(huì)自動(dòng)鏈接到Release版本。


    還要注意的就是,如果有某些項(xiàng)目是作為導(dǎo)出鏈接庫用的。需要把導(dǎo)出的dll, lib(即輸出文件路徑)設(shè)置到上面的Bin目錄下。然后在需要使用導(dǎo)出的dll和lib文件的項(xiàng)目中設(shè)置

    項(xiàng)目依賴項(xiàng)這前者,并設(shè)置附加庫目錄和附加依賴項(xiàng)。這樣可以很方便的使用同一解決方案中其他項(xiàng)目導(dǎo)出的鏈接庫了。


    總結(jié)

    以上是生活随笔為你收集整理的VS项目属性的一些配置项的总结(持续增加。。。)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。