vs添加python环境为例(Visual Studio中VC++目录与C/C++及链接器的包含目录、库目录的区别)

在实验中,在vs下,需要使用C++调用python,在配置环境时遇到了很多问题,也产生了很多疑惑。例如,在vc++中配置的包含目录库目录有什么用?vc++中已经存在有包含目录库目录的配置,为什么在C/C++链接器还有附加包含目录附加依赖项的配置,两者间有什么区别?
没有兴趣阅读全文的可以直接看总结

1. VC++下的包含目录、库目录

  • 包含目录:寻找#include<xxxx.h>中的xxxx.h的搜索目录

  • 库目录:寻找.lib文件的搜索目录

2. 附加包含目录、附加库目录、附加依赖项

  • 1附加包含目录:在这里列出了想要搜索并使其可用的“包含”目录。这告诉编译器在哪里查找尖括号中的头文件。

  • 2附加库目录:在这里列出了要搜索并使其可用的“lib”目录。这告诉链接器在哪里查找库(即,要查找的目录)

  • 3附加依赖项:在此明确指定要包含的 .lib 文件。这告诉链接器要在这些目录中查找哪些库。

用法

一般来说,如果你使用 #2,你几乎肯定也需要使用 #3。 #3 告诉链接器要链接哪个库,#2 告诉链接器在哪里可以找到该库。就像我们读写一个文件时需要指定文件名,#2可以确定文件所在路径,#3用于确定文件名。
因此简单的来说,要使用一个库,除了要include其头文件以外(附加包含目录),还要在链接过程中把lib加进去(附加库目录、附加依赖项)。

截图

3. VC++下的包含目录、库目录和附加包含目录、附加库目录、附加依赖项的区别

微软的定义

VC++ Directories: Include Directories
1. this value is inherited from the INCLUDE Windows environment variable which is defined outside of Visual Studio
2. environment variables can be: global to the computer or have user level scope
3. The INCLUDE and LIB environment variables are created when the Microsoft Windows SDK is installed with Visual Studio.

C/C++: Additional Include Directories
1. is a project level setting... you will have to define this value for every project in your solution
2. this value can be persisted to source control

分析

最初的VC++目录对应于Microsoft Windows的SDK,它的变量也是Windows的环境变量(PATH),而C/C++中的设置不是设置环境变量,它是设置命令行参数的,只针对当前工程。即:“VC++目录”影响全局,只要是电脑上这个VS创建的工程,都会被这个设置影响,而C/C++只影响单个工程。

区别

但是,在VS2010之后,VC++目录也只会影响单个工程了。之后版本VS的主要区别:VC++目录是一个Windows环境变量,C/C++是命令行参数,这是本质区别;相同的项,VC++目录中的包含目录对应C/C++中的附加包含目录,VC++目录中的库目录对应链接器中的附加库目录,二者效果相同。

4. 在VS中添加python环境操作

4.1 准备

操作系统:win10

编译器:visual studio 2019

python环境:anaconda python3.6

py脚本:demo_helloworld.py

import os

def run(str):
   return str
def main():
    print(run(("4",3)))
    
if __name__=='__main__':
   main()

4.2 操作流程

①添加包含目录和库目录, 添加你的python项目环境里面的include和libs文件夹路径,比如我是在anaconda环境下使用的虚拟环境C:ProgramDataAnaconda3envs ensorflowinclude

②注意将vs工程配置为和你的pytho环境里的解释器的为啥相同,比如你用到是X64的python环境,VS工程就要配置成X64

③添加依赖项

找到链接器-输入,附加依赖项,例如我需要添加的是C:ProgramDataAnaconda3envs ensorflowlibspython36.lib,因为我在第一步之中添加了库目录

C:ProgramDataAnaconda3envs ensorflowlibs,因此在这一步我可以直接写python36.lib,链接器会进行组合从而找到正确的.lib文件

4.3 测试

main.cpp(第一个是万能头文件,没有配置过的朋友正常使用常规的头文件就可以)

对于这部分代码看不懂的朋友可以看我的下一篇博客,c++中如何调用python

#include<bits/stdc++.h>
#include<Python.h>
using namespace std;
int main() {
	//***python调用***//
	//初始化python模块
	Py_Initialize();
	// 检查初始化是否成功  
	if (!Py_IsInitialized())
	{
		cout << "初始化失败" << endl;
		Py_Finalize();
	}

	PyObject* pModule;
	PyObject* pFunc = NULL;
	PyObject* pArg = NULL;
	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append('./')");//设置python模块,搜寻位置,文件放在.cpp文件一起


	pModule = PyImport_ImportModule("demo_helloworld");//Python文件名     
	if (!pModule) {
		cout << "py文件导入失败" << endl;
		Py_Finalize();
	}
	else {
		pFunc = PyObject_GetAttrString(pModule, "run");//Python文件中的函数名  
		if (!pFunc) {
			cout << "函数导入失败" << endl;
			Py_Finalize();
		}

		PyObject* pyParams = Py_BuildValue("(s)", "helllo world!");//c++类型转python类型

		char* result1;
		pArg = PyEval_CallObject(pFunc, pyParams);//调用函数
		PyArg_Parse(pArg, "s", &result1);//python类型转c++类型
		cout << result1 << endl;
	}
}

5. 总结

  • 包含目录用来找include<xxxx.h>中的.h文件

  • 库目录用来找需要用到的.lib文件

  • VC++选项下的包含目录==C/C++选项下的附加包含目录

  • VC++选项下的库目录==C/C++选项下附加库目录

  • 附加依赖项用于指定具体的一个或多个.lib文件

6. 参考

https://stackoverflow.com/questions/4066405/when-to-use-the-visual-studio-additional-dependencies

https://blog.csdn.net/weixin_38056657/article/details/80770580

https://blog.csdn.net/i6223671/article/details/99832186

https://blog.csdn.net/u012043391/article/details/54972127

原文地址:https://www.cnblogs.com/wjune-0405/p/14900410.html