首页 > 解决方案 > 在 C++ 项目中使用共享对象 (.so) 在 Windows 中使用 Visual Studio for Linux 使用 WSL 进行开发

问题描述

对于我的任务,我必须为 Linux 开发 C++ 代码,但要从 Windows 开发。我正在使用带有 WSL 2 的 Visual Studio 2019,并且我运行的测试运行良好,它编译 .out/.so/.a 并让我能够像调试常规项目一样调试代码。问题是当我需要将外部 .so 链接到我的项目时。在常规的 Windows-VS-c++ 开发中,我将输入链接器定义到 .lib 的目录。但在 Linux 中,他们没有 .lib(或者是他们的?我不熟悉 Linux-C++)。

简而言之,如何使用 Visual Studio 2019 使用 WSL 2 为 Linux 编译从另一个项目中使用共享对象 (.so) 文件?

标签: c++linuxvisual-studio-2019wsl-2

解决方案


请求你的老板允许在你的工作计算机上安装 Linux

(例如,某些独立磁盘分区中的一些正版 Linux 发行版,如DebianUbuntu)。这是 - 就努力和你的时间而言 -最便宜的路线

阅读课程Advanced Linux Programmingsyscalls(2)如何编写共享库dlopen(3)proc(5)elf(5)ld.so(8)Program Library HowToC++ dlopen minihowtoGCC的文档,GNU make的文档,GNU binutils的文档,GDB的文档。

当然,请阅读有关C++ 编程的更多信息。C++ 是一种困难的语言(在 Linux 和 Windows 上)。参考这个网站。稍后阅读 C++11 标准n3337

如果您编写单个C++ 翻译单元foo.cc(您可以使用GNU emacs来编辑它),首先foo.so 使用命令g++ -Wall -Wextra -g -fPIC -shared foo.cc -o foo.so(所有警告、DWARF 调试信息、位置无关代码)将其编译为共享对象。

如果您的 C++ 共享库是由多个C++ 翻译单元构建的,请了解如何使用构建自动化工具,例如 GNU makeninja。并在命令行的终端模拟器中使用它。请注意ASLR。使用strace(1)ltrace(1)gdb(1)了解您或其他软件的动态行为。

在某些情况下,生成部分 C++ 代码(例如使用ANTLRSWIG)是值得的。请注意,Qt正在这样做。

考虑使用一些跨平台的 C++ 框架,例如QtPOCO

对于某些项目,编写GCC 插件可能很有用。见这份报告草稿

简而言之,如何使用 Visual Studio 2019 使用 WSL 2 为 Linux 编译从另一个项目中使用共享对象 (.so) 文件?

不要使用Visual Studio(我自己从未使用过它,但据传闻它不适合从 Windows 到 Linux的交叉编译)。也许使用Visual Studio Code(我更喜欢GNU emacs,但您可以尝试geditgeanyvimkate等...)

在 Linux 上,所有用于 C++ 编程的 IDE 都将运行GCCClang编译器(您需要了解它们为您运行的编译命令)。您也可能对Clang 静态分析器Frama-C++感兴趣

从 Linux 上现有的开源 C++ 项目中汲取灵感

githubgitlab上查找- 例如libonionQtFLTKfishicecream)...另请阅读Linux From Scratch

最重要的是,以新鲜和开放的心态处理 Linux 编程。

阅读Unix 哲学,它与 Linux 相关。并且与微软Windows相关的设计思路大相径庭。

我从未使用过 Windows(自 1974 年以来我一直在编码),但我有偏见的观点是,WSL 的目标是 Linux 专家,他们(可悲的是)必须使用 Windows。我相信 WSL 并不是针对 Linux 新手的。


推荐阅读