【问题标题】:How to make program which can be compiled in gcc (Linux) and VS (Windows)?如何制作可以在 gcc (Linux) 和 VS (Windows) 中编译的程序?
【发布时间】:2015-02-22 00:17:15
【问题描述】:

我必须编写程序来更改文件夹中特定文件的扩展名。我已经完成了 Linux 版本(使用 gcc 编译),现在我想知道我应该如何编辑它才能在 Windows(在 VS 中)编译它并让它在那里工作。它必须是一个程序(我不能做 2 个版本,一个用于 gcc,一个用于 VS)。

我必须使用的语言是 C。

我在那里使用什么:

pthread.h library (multi-threading)

dirent.h library (opendir, readdir, rewinddir)

unistd.h library (chdir, usleep)

那么我应该怎么做才能让它在两个操作系统上使用相同的源代码在 windows 和 linux 中编译和工作呢?我知道我必须在 Windows 中使用不同的功能扫描文件夹并更改扩展名,但是如何将所有这些合并到一个文件中?

【问题讨论】:

  • 删除所有 POSIX 系统调用并用 Win32/64 系统调用替换它们是最好的方法,或者您可以使用在两者上编译并处理相同操作的 Boost 或 QT 库
  • 我相信我必须使用“标准”库。替换这些调用后,它将在 Windows 上运行,但不再在 linux 上运行。我必须编写可以在两个系统中编译并在两个系统中工作的源代码。
  • 我个人更喜欢使用 MinGW——一套用于寡妇的 POSIX 库。我已经用它制作了程序和库。还有 Cygwin,但我认为这有点太重量级了。另一个问题是微软不再制作 C 编译器。 VS 仅编译 C++,或使用 1999 年以前 C 的一小部分子集的程序。
  • @LeeDanielCrocker:不完全正确,VS 2013 引入了对 C99 复合文字、指定初始化程序以及库功能的支持(请参阅 thisthis)。当然你可以用它编译C代码。不过我同意,它远非完全符合 C99 标准,而且 C11 似乎完全被他们忽略了(当然 POSIX 也被忽略了)。
  • 我相信我在这个公告之后下载了 VS,它仍然无法编译我的库,但我会更仔细地查看。

标签: c linux windows visual-studio gcc


【解决方案1】:

如果您必须为两个编译器提供相同的源代码树,那么以下方法如何:

#ifdef linux
#include <scanner_linux.c>
#else
#include <scanner_win.c>
#endif

这样,您可以拥有两个不同的源文件,但您可以为两个编译器提供相同的输入文件。

当我必须进行这种 Linux/Windows 编译时,我通常使用 cygwin。它很容易安装,没有 Cygwin 的 Windows 用户只需要cygwin.dll

【讨论】:

    【解决方案2】:

    一般问题是 Windows 不符合 POSIX 标准。如果您甚至不想接触您的代码(也就是说,在 Win 上使用它们的对应项重写 POSIX 调用并使用预处理器的条件指令调整您的代码),您可以尝试添加Cygwincygwin1.dll,所以 POSIX 调用用它重新映射。但是,您可能对 Cygwin 的许可限制不满意。

    更多参考请见https://www.cygwin.com/faq.html#faq.programming.msvs-mingw

    【讨论】:

    • 您仍然可以使用在 Windows 线程上分层的 pthreads 实现。如果您希望在不使用 cygwin 许可证的情况下使用 bash 等,您可以选择 cygwin mingw 交叉编译器或 Windows 10 bash 支持。甚至微软都在试图设置难以逾越的障碍,这一点尚不清楚。
    【解决方案3】:

    对于堆栈溢出,这可能是一个过于宽泛的问题。有许多可能的方法来解决这个问题。你需要使用VS吗?一种方法是在 Windows 上构建和安装 gcc,如 here 所述。

    另一种可能性是将大部分代码分成多个 c 文件,然后简单地 #ifdef 很多东西。

    您可以在answer 中找到一些更通用的有用信息。

    【讨论】:

    • 是的,我需要使用VS。我想我必须使用一些#ifdef 来检测使用的是哪个系统。但后来我不确定该怎么做。我可以做两个大的 if 声明,一个在系统是 linux 时执行,另一个在 windows 时执行,但是这样的代码不会编译。
    • 使用动态库怎么样?我从来没有使用过它们,但有没有涉及使用它们的解决方案?
    • Visual Studio 能在 Linux 下运行吗??? 不知道有这样的 VS 实现。
    猜你喜欢
    • 2014-03-26
    • 2011-09-22
    • 2016-12-20
    • 2021-10-27
    • 1970-01-01
    • 2011-01-03
    • 2018-05-24
    相关资源
    最近更新 更多