如何在wine上开发C++(Ubuntu)在编译后自动启动

fcipmucu  于 2022-11-22  发布在  其他
关注(0)|答案(2)|浏览(416)

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

不像在windows上,在我编译并运行后,它成功地生成/编译到“exe”中,但cmd没有显示。

我找到了一种方法,通过启动终端并将
我的命令是
它工作,但需要时间手动启动“exe”。
我如何让dev c++自动在wine中找到cmd并执行编译后的代码?
先谢谢你了。
最新消息:
当我发布这个问题的时候,我是Linux/Ubuntu的新手,这就是为什么我在寻找/期待wine中的功能。但是现在经过2年的时间,我发现wine上运行的代码块是针对Windows的,一旦编译就不能调用ubuntu终端。

0kjbasz6

0kjbasz61#

默认情况下,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中的任何地方,它都应该工作。
然而,还有一个问题存在。由于未知的原因,如果被Dev-C++这样的应用程序调用,Ubuntu的可执行文件不会在一个单独的窗口中执行,这与Windows不同。因此,你必须找到一种方法将ConsolePauser.exe带到一个新窗口中。
一种简单方法是将文件重命名为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中的同一个文件夹里,熟悉的旧控制台暂停器就会像一个魅力一样工作。

eh57zj3b

eh57zj3b2#

我想提交我的方法,尽管它不是Ubuntu特有的,它可以在任何安装了xterm的发行版上工作。将ConsolePauser.exe重命名为ConsolePauserEngine.exe,并在同一目录下创建一个新的ConsolePauser.exe文本文件,其中包含以下行:

#! /bin/sh

CMD=$(printf "%q" $@)   #https://stackoverflow.com/questions/2854655/command-to-escape-a-string-in-bash#answer-2856010
CONSOLE_PAUSER_PATH=$(printf "%q" "C:\Program Files (x86)\Dev-Cpp\ConsolePauserEngine.exe")

xterm -e "wine $CONSOLE_PAUSER_PATH $CMD"

编辑:不要忘记将新的ConsolePauser.exe设置为可执行文件。

相关问题