我可以在Linux上使用Visual C编译C吗?

时间:2018-04-10 15:27:51

标签: c linux compilation mingw

我正在使用Visual Studio在C中开发教育系统。我将通过Web服务器支持此服务。

问题是我的服务器运行Linux操作系统。我可以在Linux上使用Visual C编译C代码吗?它必须编译为Windows可执行文件(* .exe)。

通过搜索我得到了答案:“你可以用MinGW编译C”。但是,我使用了很多Windows API,我不相信这个答案。 (_beginthreadex,FillConsoleOutputCharacter,CreateConsoleScreenBuffer和stuff)。

如果我想将C代码编译为Linux系统上的Windows可执行文件,是否必须使用MinGW进行开发?

2 个答案:

答案 0 :(得分:2)

  

我可以在Linux上使用visual c编译C吗?

不,在实践中你不能(当然你不应该)。顺便说一句,如果你坚持某些C标准,如C11(见n1570)或C99或C++14,你可能不太关心特定的编译器。

  

但我使用了很多windows apis

正如您所猜测的,这些Windows API特定的MicroSoft Windows,您无法在Linux上获取(或使用)它们(您可能需要Microsoft许可证)使用WinAPI运行程序)。请注意Wine能够在Linux 某些 Windows executables上运行(但您可能无法通过某些Web服务器使用它)。

你应该使用POSIX线程(here是一个很好的教程) - 或者考虑在C ++ 11中编码并使用它的thread库(因为C11 thread库也是如此最近在Linux上 - 也可能在Windows上!)。

我的建议:

  • 如果您的程序是某个HTTP服务器,请考虑使用某些HTTP服务器库,如libonionWt(或者使用FastCGI使您的应用程序与其他某些Web通信服务器)。如果您这样做,请熟悉HTTP(& HTML5和其他网络技术,例如AJAX)。

  • 如果您的应用需要终端界面(不是网络界面!),请使用ncurses

  • 如果你的应用程序想要一个GUI界面(不是网络界面!),请使用widget toolkitQt之类的GTK(这些是跨平台的,所以你的代码对其他操作系统来说是可移植的。)

  • 如果跨平台可移植性很重要,请考虑使用BoostPocoQtWt等C ++框架。

  • 在您自己的笔记本电脑上安装和使用Linux非常简单,Linux非常适合开发人员使用。阅读一些Linux系统编程书(也许是旧的ALP)。另请参阅intro(2)syscalls(2)intro(3)

请注意,WinAPI是专有的(对Microsoft而言),但POSIX是标准规范(Linux实际上主要是POSIX兼容的)。

  

我必须和mingw一起发展吗?

我建议在您的开发计算机上安装和使用Linux ,然后使用GCC和/或Clang(在命令行上,但您可能会这样做)使用build automationmake之类的ninja工具。别忘了启用所有警告和调试信息(例如使用g++ -Wall -Wextra -g编译)。当然你需要为Linux& POSIX API(不是Windows版)。

(它正在使您的代码适应Linux和POSIX API,它将完成大部分工作,而不是使用GCCClang,它们都是C99或C11或C +符合+11或C ++ 14标准,并接受许多常用选项。)

我还建议您在open source的某个github许可下发布源代码。然后你可能会得到一些帮助。

您可能对WSL感兴趣,因为在某些情况下您可能会在Windows上运行Linux可执行文件

(但我不知道细节,因为我从未使用过Windows)

PS:如果要为 Windows编译,将Windows保留在笔记本电脑上会更简单;因为cross-compilation不太方便。

答案 1 :(得分:2)

  
    

我必须和mingw一起发展吗?

  

MinGW是Windows操作系统的GCC端口,没有别的。即您可以直接在Windows上编译Windows特定代码,或者在GNU / Linux上交叉编译相同的代码,然后在Windows上运行可执行文件。 GCC - 表示GNU编译器集合,它有C,C ++,Objective C和其他一些编译器。 GCC C编译器是GNU linux使用的主要C编译器。

  
    

我可以在linux上使用visual c编译c吗?

  

不,你不能,因为Visual Studio C编译器没有移植到GNU / Linux。但您可以使用GCC编译C代码。

  
    

但我使用了很多windows apis,我不相信这个答案。 (_beginthreadex,FillConsoleOutputCharacter,CreateConsoleScreenBuffer和stuff)

  

如果您需要在GNU / Linux操作系统上运行为Windows编写的程序,可以使用Wine。即在Windows上编译你的exe文件,然后在GNU / Linux上运行它。

同时,这不是个好主意。最好使用一些标准或跨平台API。然后使用您想要的任何编译器将其编译为您想要使用的操作系统。

E.G。

  1. thrd_create而不是_beginthreadex
  2. ncursespdcurses代替Windows控制台特定功能