25

WindowsとLinuxのAPI関数の間に1対1の同等性があるかどうかを知りたくありません。また、すべてのAPI関数を知りたくありません。

私は2つの基本的なことについてこれを知りたいだけです:

  1. Qtプラットフォームに依存しない理由を理解したい
  2. Win32 APIで、つまりWin32 APIレベルでプログラムされたアプリケーションを移植するために、LinuxでどのAPIを使用すべきか知りたいです。

これは実用的ではないことは知っていますが、この同等性を知りたいと思います。

4

2 に答える 2

24

システムコールとは何かを理解する必要があります。Linuxでは、これらは可能な限り低いユーザーランドAPIです(対照的に、Win32 APIは、実際のカーネルシステムコールをいくつかのライブラリ関数とlibc混合します。Linuxでもそのような混合を行います)。fork(2)execve(2)open(2)pipe(2)mmap(2)read(2)poll(2)close(2)dup2(2)sigaction(2)は重要なシステムコール(ただし、約300個あります。正確なLinuxカーネルに依存するリストについては、syscalls(2)を参照してください)。

Linuxで各Windows機能が利用可能になると期待しないでください(その逆も同様です)。

そのような同等のものを考えさえしないでください。

Linuxで別の考え方を身に付けましょう。

(特に、プロセスはLinuxとWindowsで大きく異なります)。

Linuxはフリーソフトウェアであることを忘れないでください。Linuxで使用しているすべての関数のソースコードに飛び込むことができます。それを読んで、それを検索して、それを改善してください.....

最初にintro(2)のマニュアルページを読み、他のいくつかのマニュアルページ(特にsyscalls(2)intro(3)など)を読んでください。高度なLinuxプログラミング高度なUnixプログラミングなどもお読みください。

一部のライブラリは、Posix(Linuxなど)とWindowsの両方に共通の抽象化を除外して提供しようとします。特にQt(およびGtkまたはFLTKまたはPOCO、およびWebアプリケーションの場合はWt、データベースの場合はsqlite )。

一部のオープンソースサーバーソフトウェア(lighttpdeximpostgresqlなど)は、LinuxとWindowsの両方で実行できます(もちろん、再コンパイル後)。

グラフィカルインターフェイスに興味がある場合は、X11の重要な役割を理解してください X11サーバーは画面とキーボードに最も近いことに注意してください。ほとんどのグラフィカルアプリケーションはX11クライアントです)。2016年または2020年には、X11はWaylandに取って代わられる傾向があります(ただし、QtまたはGTKに対してコーディングする場合、実装の「詳細」(非常に主要なもの)に気付くことはありません) 。

標準のC++関数に加えてQtおよび/またはPOCO呼び出し(LinuxまたはWindowsに固有であると文書化されていないもの)のみを使用してアプリケーションを作成する場合、LinuxからWindowsに、またはその逆にソース移植可能である必要があります。

于 2013-01-04T18:04:36.987 に答える
6

Win32呼び出しを使用するアプリケーションを移植する場合、最善の策はWineLibを使用することです。これはWineを支えるライブラリを使用しますが、Wineを使用してアプリケーションを実行するのと同じではありません。WineLib共有ライブラリを使用するだけで、アプリケーションをLinuxアプリケーションとして再コンパイルします。ただし、UIレイヤーを変更しない限り、Windowsアプリケーションのように見えます。

回答の他の場所で述べられているように、LinuxのWin32に直接相当するものはありません。Win32のさまざまなビットがさまざまなコンポーネントによって提供され、コンポーネントを選択できる場合もあります。これが可能なのは、Win32の一部に相当するものが下位レベルでネイティブに実装されているためです。たとえば、Win32はUIコンポーネントを提供します。これは、GTK、Qt、またはその他のツールキット(WineLibなど)で利用できるものです。 Xと対話します。通常、低レベルのAPI呼び出しを使用して独自のコンポーネントを描画するのではなく、Win32のコンポーネントを使用するのと同じように、通常、Xを直接使用するのではなく、高レベルのUIツールキットのコンポーネントを使用します。

于 2013-01-04T18:21:41.410 に答える