美文网首页EOS技术详解
使用Visual Studio 2017开发Linux程序

使用Visual Studio 2017开发Linux程序

作者: 苗政委 | 来源:发表于2018-10-21 11:36 被阅读0次

    使用Visual Studio 2017开发Linux程序

    环境:

    win7_x64旗舰版、VS2017企业版、VMware10.0.2、CentOS7
      在CentOS7上首先需要安装gcc、g++和gdbserver,这里就不多说

    一、安装VS2017

    1.1 安装VS2017时,必须要勾选“使用C++的Linux开发”工具集


    使用C++的Linux开发

    二、创建Linux解决方案

    2.1 创建一个名称为"TestLinux"的解决方案,我们稍后会在这个解决方案内新建多个Linux项目(包括可执行程序、动态库、静态库等)


    创建Linux解决方案

    2.2 添加新建项目可执行程序项目"test"


    创建linux项目
    控制台应用程序
    2.3 添加新建项目,创建动态库
    创建动态库
    创建动态库

    2.4 添加新建项目,创建静态库


    创建静态库
    创建静态库

    三、添加测试代码

    3.1 "test"项目中main.cpp代码:

    int main()
    {
        printf("hello from test!\n");
        printf("static_library test : %d\n", static_test(1));
        printf("dynamic_library test : %d\n", dynamic_test(1)); return 0;
    }
    

    3.2 在"static_library"项目中添加static.h和static.cpp

    static.h

    #ifndef _STATIC_LIBRARY_H_ 
    #define _STATIC_LIBRARY_H_
    int static_test(int n); 
    #endif // !_STATIC_LIBRARY_H_
    

    static.cpp

    #include "static.h"
    int static_test(int n)
    { return n * 3;
    }
    

    3.3 在"dynamic_library"项目中添加dynamic.h和dynamic.cpp
    dynamic.h

    #ifndef _DYNAMIC_LIBRARY_H_
     #define _DYNAMIC_LIBRARY_H_
    int dynamic_test(int n);
     #endif // !_DYNAMIC_LIBRARY_H_
    

    dynamic.cpp

    #include "dynamic.h"
    int dynamic_test(int n)
    { return n * 2;
    }
    

    四、项目配置

    4.1 "常规"配置

    配置主程序:

    配置属性-常规

    本地输出目录:"(ProjectDir)bin\(Platform)$(Configuration)"修改为"(ProjectDir)..\bin\(Platform)$(Configuration)",是为了将所有项目输出文件放到同一个目录中,方便相互引用。

    目标文件扩展名:".out"修改为"",是为了不生成文件后缀,一般的Linux可执行程序是没有扩展名称的,可修改也可不修改。

    远程生成根目录:"~/projects"修改为"/root/projects/(SolutionName)","~"和"/root"是等价的,但是运行时动态库搜索目录不支持~路径,添加“(SolutionName)”是为了区分不同的解决方案下相同名称的项目。

    远程生成项目目录:"~/projects"修改为"/root/projects/(SolutionName)","~"和"/root"是等价的,但是运行时动态库搜索目录不支持~路径,添加“(SolutionName)”是为了区分不同的解决方案下相同名称的项目。

    配置动态库:"(RemoteRootDir)/(ProjectName)"修改为"$(RemoteRootDir)"

    配置属性-常规

    本地输出目录:"(ProjectDir)bin\(Platform)$(Configuration)"修改为"(ProjectDir)..\bin\(Platform)$(Configuration)"

    目标文件扩展名:".out"修改为".so"

    远程生成根目录:"~/projects"修改为"/root/projects/$(SolutionName)"

    配置类型:"应用程序(.out)"修改为"动态库(.so)"

    配置静态库:

    配置属性-常规

    本地输出目录:"(ProjectDir)bin\(Platform)$(Configuration)"修改为"(ProjectDir)..\bin\(Platform)$(Configuration)"

    目标文件扩展名:".out"修改为".a"

    远程生成根目录:"~/projects"修改为"/root/projects/$(SolutionName)"

    配置类型:"应用程序(.out)"修改为"动态库(.a)"

    4.2 "调试"配置

    配置属性-调试

    程序:"(RemoteTargetPath)"修改为"(RemoteRootDir)/bin/(Platform)/(Configuration)/(TargetName)(TargetExt)",因为前面修改了本地输出目录导致远程输出目录也相应发生变化,这里修改一致。

    工作目录:"(RemoteOutDir)"修改为"(RemoteRootDir)/bin/(Platform)/(Configuration)",这个是远程主机CentOS上的路径,如果设置不正确将找不到引用的动态库,调试程序无法启动。

    其他调试程序命令:""修改为"set solib-search-path (SolutionDir)bin/(Platform)/$(Configuration)",这个是本地路径,调试符号是从本地加载的,否则调试动态库时,gdb会输出没有找到调试符号文件。

    4.3 "C/C++"配置

    "C/C++"配置

    附加包含目录:在"$(StlIncludeDirectories);%(AdditionalIncludeDirectories)"前面添加"./..;",这个是远程主机CentOS上的路径,相当于gcc编译时指定"-I[路径]"选项;一般是先把需要的头文件从CentOS复制到windows,然后设置"配置属性"->"VC+ +目录"->"包含目录",这样在编写Linux程序时,提示信息更加的友好^^。

    4.4 "链接器"配置

    "链接器"配置

    附加库目录:在"%(AdditionalLibraryDirectories)"前面添加"(RemoteRootDir)/bin/(Platform)/$(Configuration);",这个是远程主机CentOS上的路径,相当于gcc编译时指定"-L[路径]"选项,用于指定引用动态库和静态库的目录;

    "链接器"配置

    库依赖项:添加"dynamic_library;static_library",相当于gcc设置"-l[库名称]"选项,用于指定链接时所需要的动态库和静态库名称,如果找不到依赖的库文件,链接时会错误,显示"无法解析的符号"。

    "链接器"配置

    其他选项:添加"-Wl,-rpath=(RemoteRootDir)/bin/(Platform)/$(Configuration) ",指定程序运行时搜索动态库的路径。

    五、开始调试

    5.1 设置远程调试主机

    远程调试主机

    5.2 显示Linux控制台

    Linux控制台 Linux控制台

    最后的Demo下载地址:TestLinux.zip

    其他错误:

    1)Inferior 1 (process 6074) exited normally

    image

    通常是没有生成Debug可执行文件,若使用cmake,则添加CMAKE_BUILD_TYPE=Debug,重新生成即可。
    为代码补全添加对 Linux 库函数的支持
    虽说上述代码可以直接运行,然而宇宙第一 IDE 竟然不提供代码补全,反而告诉你头文件找不到/函数未定义,并且打了一大堆的波浪线~~~~~~~~~~~~~~~~!想逼死强迫症么?

    6、将 Linux Headers 拷贝到 VS Linux 头文件目录中为 VS 添加对 Linux 库函数的支持!

    通过如下步骤打开下图窗口:

    解决方案 - 项目名 - (右键) - 属性 - 配置属性 - VC++目录 - 常规 - 包含目录 - (单击) - (下箭头) - 编辑

    image.png

    找到 Linux 头文件所在目录。我的目录是这样的:

    D:\Software\Studio\Visual Studio Community 2017\Common7\IDE\VC\Linux\include\usr\include\
    

    要知道 WSL 是可以直接访问 Windows 目录的。WSL 根目录下的mnt/下保存着各逻辑分区的卷标,你会看到c、d、e etc. 这样的目录名。我们可以直接把 WSL 中的 Linux 头文件拷贝到 VS 的 linux 头文件目录中,比如:

    cp usr/include/ /mnt/d/Software/Studio/Visual\ Studio\ Community\ 2017/Common7/IDE/VC/Linux/include/usr/include/ -R
    

    相关文章

      网友评论

        本文标题:使用Visual Studio 2017开发Linux程序

        本文链接:https://www.haomeiwen.com/subject/zgfbzftx.html