zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    时间格式
    分页1
    vs2010 VS2008 VS2005 快捷键大全
    css 常用标签
    JS Array数组操作
    CSS属性
    jquery 选择器大全
    @fontface
    以前写过的ajax基础案例(王欢huanhuan)
    Jquery操作下拉框(DropDownList)的取值赋值实现代码(王欢)
  • 原文地址:https://www.cnblogs.com/wjune-0405/p/14900410.html
Copyright © 2011-2022 走看看