c++ - 在 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) 文件?
解决方案
请求你的老板允许在你的工作计算机上安装 Linux
(例如,某些独立磁盘分区中的一些正版 Linux 发行版,如Debian或Ubuntu)。这是 - 就努力和你的时间而言 -最便宜的路线。
阅读课程Advanced Linux Programming、syscalls(2)、如何编写共享库、dlopen(3)、proc(5)、elf(5)、ld.so(8)、Program Library HowTo、C++ dlopen minihowto、GCC的文档,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 make或ninja。并在命令行的终端模拟器中使用它。请注意ASLR。使用strace(1)、ltrace(1)、gdb(1)了解您或其他软件的动态行为。
在某些情况下,生成部分 C++ 代码(例如使用ANTLR或SWIG)是值得的。请注意,Qt正在这样做。
考虑使用一些跨平台的 C++ 框架,例如Qt或POCO。
简而言之,如何使用 Visual Studio 2019 使用 WSL 2 为 Linux 编译从另一个项目中使用共享对象 (.so) 文件?
不要使用Visual Studio(我自己从未使用过它,但据传闻它不适合从 Windows 到 Linux的交叉编译)。也许使用Visual Studio Code(我更喜欢GNU emacs,但您可以尝试gedit、geany、vim、kate等...)
在 Linux 上,所有用于 C++ 编程的 IDE 都将运行GCC或Clang编译器(您需要了解它们为您运行的编译命令)。您也可能对Clang 静态分析器或Frama-C++感兴趣
从 Linux 上现有的开源 C++ 项目中汲取灵感
在github或gitlab上查找- 例如libonion、Qt、FLTK、fish、icecream)...另请阅读Linux From Scratch。
最重要的是,以新鲜和开放的心态处理 Linux 编程。
阅读Unix 哲学,它与 Linux 相关。并且与微软Windows相关的设计思路大相径庭。
我从未使用过 Windows(自 1974 年以来我一直在编码),但我有偏见的观点是,WSL 的目标是 Linux 专家,他们(可悲的是)必须使用 Windows。我相信 WSL 并不是针对 Linux 新手的。
推荐阅读
- php - 将子菜单条目添加到 WooCommerce“产品”管理菜单
- javascript - ES6 类的 Javascript 对象
- oracle - BlobToClob 在 AL32UTF8 中未按预期工作
- apache-kafka - Kafkacat:如何删除一个主题或其所有消息?
- powershell - 打开递归文件夹列表中的第一个文件
- java - 使用 assertJ 断言 selenium getAllSelectedOptions()
- bash - 当文件名中有空格时,用于批量图像转换的脚本不起作用
- csv - 如何将数据集放入数组
- git - 如何在代理后修复 git clone 企业存储库中的 openssl SSL_connect SSL_ERROR_SYSCALL 错误?
- flutter - 在 Flutter 中复制 Android 渐变