引用
http://blog.csdn.net/qing101hua/article/details/53841827
http://blog.csdn.net/zcedar/article/details/51444343
两个问题
- 在visual studio中配置第三方代码库时涉及到包含目录和库目录,那么Include Directories和Additional Include Directories,以及Library Directories和Additional Library Directories该如何区分,如何设置呢?
- 第三方库是否支持auto-linking,什么时候指定附加依赖项lib,什么时候不需要?
VS中C++的包含目录、附加包含目录和库目录以及附加库目录的区别
在IDE中,右键一个Project,可以发现有两个地方设置Include的相关目录:
1,VC++ Directories -> Include Directories
2,C/C++ -> General -> Additional Include Directories
同理,设置Lib也有两个地方
1,VC++ Directories -> LibraryDirectories
2,Linker -> General -> Additional Library Directories
应该如何设置呢?
MSDN上的解释如下:
“VC++ Directories -> Include Directories” : Directory settings displayed in the window are the directories that Visual Studio will search for include files referred to in your source code files. Corresponds to environment variable INCLUDE.
More information :
http://msdn.microsoft.com/en-us/library/t9az1d21(v=vs.80).aspx“C/C++-> General -> Additional Include Directories”: The directory to be added to the list of directories searched for include files. More information :
http://msdn.microsoft.com/en-us/library/73f9s62w(v=vs.80).aspx
下面这个链接中给出了编译器在编译过程中查找包含目录(Include文件)的顺序:
The compiler searches for directories in the following order:
- Directories containing the source file.
- Directories specified with the /I option, in the order that CL encounters them.
- Directories specified in the INCLUDE environment variable.
其中step2中的/I是由C/C++ -> General -> Additional Include Directories设置的。
而step3中的INCLUDE是由VC++ Directories -> Include Directories设置的。
所以从这里看出,不同的设置有不同的编译链接顺序。
因此,总结出两种设置方法:
- VC++ Directories -> Include Directories配合VC++ Directories -> LibraryDirectories
- C/C++ -> General -> Additional Include Directories配合Linker -> General -> Additional Library Directories
但是要注意,由于编译顺序,这种用法情况下需要确保在VC++ Directories -> Include
Directories中填入$(IncludePath),很简单,选一个空的目录,IDE会自动生成。
最后不要忘了,如果有dll,需要设置环境变量,或者拷贝至exe执行目录
关于auto-linking
在配置opencv和boost库的时候发现了存在这个问题,但是不幸的是opencv并不支持auto-linking,也即是需要在附加依赖库里填写一大堆的库文件名(或者代码中#pargma comment),而boost却不用,它可以自动在lib目录中根据lib的名字寻找到对应的lib进行link,这个就是超级方便的auto-linking功能
stackoverflow上解释:How boost auto-linking makes choice?
http://stackoverflow.com/questions/22805082/how-boost-auto-linking-makes-choice