如何在 wine (Ubuntu) 上制作 Dev C++ 在编译后自动启动

How To Make Dev C++ on wine (Ubuntu) automatically launches after compile

我想尝试一些仅在 windows 中可用的 C 库,所以我安装了 wine 并安装了 dev C++。

与 windows 不同,在我编译和 运行 之后,它成功 generate/compile 进入 "exe" 但 cmd 没有显示。

我通过启动终端并输入

找到了如何 运行 exe 的方法

$wine 命令 $myc.exe

它可以工作,但手动启动 "exe" 需要时间。

如何让dev c++在wine中自动找到cmd并执行编译后的代码?

提前谢谢你。

Dev-C++ 默认依赖于一个名为 ConsolePauser.exe 的简单文件。该文件调用编译后的.exe文件,退出后给出熟悉的Process exited after 0.xxxxx seconds with return value x.提示

然而,ConsolePauser.exe 是原生的 Windows 二进制文件,它不能在 Ubuntu 中执行,除非被 Wine 调用。此外,ConsolePauser 调用可执行文件的裸名,而不是调用 Wine,这是必需的。

因此,要使 Dev-C++ 在您按下 F9 后自动生成 运行 .exe 文件,您需要做的是构建您自己的 ConsolePauser。这个其实很简单:

#include <chrono>
#include <iostream>
#include <string>

int main(int agrc, char ** argv)
{
    using namespace std;
    string s = argv[1];
    string s1;
    for (const auto & ss : s)
    {
        if ((ss == ' ') || (ss == '\')) s1.push_back('\');
        s1.push_back(ss);
    }
    s = "wine " + s1;
    auto begin = chrono::high_resolution_clock::now();
    auto retVal = system(s.c_str());
    auto end = chrono::high_resolution_clock::now();
        
    cout << "-------------------------------------" << endl;
    cout << "Process completed after " << chrono::duration_cast<chrono::milliseconds>(end - begin).count();
    cout << " milliseconds with return value " << retVal << "." << endl;
    cout << "Press any key to continue. . ." << endl;
    
    cin.get();
    
    return 0;
}

它所做的只是解析参数,转义所需的字符,并将其传递给 Wine。这是一个快速而肮脏的版本,您可以通过检查 argc == 1 来开始改进它。 使用 Ubuntu 的 编译器将其编译为 ConsolePauser.exe,将其放在计算机 PATH 的任何位置,它应该可以工作。

但是,存在另一个问题。出于未知原因,Ubuntu 的可执行文件不会在单独的 window 中执行,如果被像 Dev-C++ 这样的应用程序调用,这与 Windows 不同。因此,您将不得不想办法将 ConsolePauser.exe 带到新的 window.

一个简单的方法是将文件重命名为 ConsolePauser1.exe,并将此代码用于 ConsolePauser.exe:

#include <iostream>
#include <string>
using namespace std;

int main(int argc, char ** argv)
{
    string s = argv[1];
    //Opens new window through gnome-terminal:
    string command = "gnome-terminal -e ";
    command += string("\"") + "bash -c ";
    command += string("\\"") + "ConsolePauser1.exe ";
    command += string("\\\\"") + s;
    command += string("\\\\"");
    command += string("\\"");
    command += string("\"");
    system(command.c_str());
    cerr << command << endl;
    
    //Make sure that window lingers...
    system("exec bash");
    return 0;
}

将这两个文件放在您的 PATH 中的同一个文件夹中,熟悉的旧 Console Pauser 将非常有用。

我想提交我的方法,尽管它并不特定于 Ubuntu。它可以与安装了 xterm 的任何发行版一起使用。 将 ConsolePauser.exe 重命名为 ConsolePauserEngine.exe 并在同一目录中使用以下行创建一个新的 ConsolePauser.exe 文本文件:

#! /bin/sh

CMD=$(printf "%q" $@)   #
CONSOLE_PAUSER_PATH=$(printf "%q" "C:\Program Files (x86)\Dev-Cpp\ConsolePauserEngine.exe")

xterm -e "wine $CONSOLE_PAUSER_PATH $CMD"

编辑:不要忘记使新的 ConsolePauser.exe 可执行。