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:\ProgramData\Anaconda3\envs\tensorflow\include
②注意将vs工程配置为和你的pytho环境里的解释器的为啥相同,比如你用到是X64的python环境,VS工程就要配置成X64
③添加依赖项
找到链接器-输入,附加依赖项,例如我需要添加的是C:\ProgramData\Anaconda3\envs\tensorflow\libs\python36.lib,因为我在第一步之中添加了库目录
C:\ProgramData\Anaconda3\envs\tensorflow\libs,因此在这一步我可以直接写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