-1

私の目標は、現在のマウス位置を単純に返すプログラムを実装することです (ウィンドウを開かずに、何が実行されているかに関係なく)。これを検索した後、私が見つけた最も簡単で最も近い実装は、この種のことを行うための Python ライブラリであるautopyによるものでした。

現在のマウス位置を返す関数「get_pos()」。こちらのドキュメントを参照してください。「get_pos()」関数を独自に実装したいだけです (開発中のプログラムの autopy から含める必要があるのはそれだけだからです)。

github リポジトリで、autopy のソース コードを検索したところ、次の結論に達しました。「get_pos()」を呼び出すと、*mouse_get_pos 関数が発生します (完全なコードはこちらを参照してください)。

/* Syntax: get_pos() => tuple (x, y) */
/* Description: Returns a tuple `(x, y)` of the current mouse position. */
static PyObject *mouse_get_pos(PyObject *self, PyObject *args);

この関数は「getMousePos」を呼び出しているようです:

static PyObject *mouse_get_pos(PyObject *self, PyObject *args)
{
    MMPoint pos = getMousePos();
    return Py_BuildValue("kk", pos.x, pos.y);
}

これは、mouse.cヘッダー ファイルにあります。

MMPoint getMousePos()
{
#if defined(IS_MACOSX)
    CGEventRef event = CGEventCreate(NULL);
    CGPoint point = CGEventGetLocation(event);
    CFRelease(event);

    return MMPointFromCGPoint(point);
#elif defined(USE_X11)
    int x, y; /* This is all we care about. Seriously. */
    Window garb1, garb2; /* Why you can't specify NULL as a parameter */
    int garb_x, garb_y;  /* is beyond me. */
    unsigned int more_garbage;

    Display *display = XGetMainDisplay();
    XQueryPointer(display, XDefaultRootWindow(display), &garb1, &garb2,
              &x, &y, &garb_x, &garb_y, &more_garbage);

    return MMPointMake(x, y);
#elif defined(IS_WINDOWS)
    POINT point;
    GetCursorPos(&point);

    return MMPointFromPOINT(point);
#endif
}

このコードには、すべてのオペレーティング システムでマウスの位置を返すメソッドが含まれているようです。これをプログラムに実装しようとしています。この c 関数を自分のシステムで適切に動作させて、自分のプログラムに実装できるようにするにはどうすればよいですか?

編集:「gcc mouse.c」を使用して単純にmouse.cをコンパイルしようとしましたが、次のエラーが発生しました:

Undefined symbols for architecture x86_64:
  "_CFRelease", referenced from:
      _moveMouse in ccVkh5f7.o
      _getMousePos in ccVkh5f7.o
      _toggleMouse in ccVkh5f7.o
  "_CGEventCreate", referenced from:
      _getMousePos in ccVkh5f7.o
  "_CGEventCreateMouseEvent", referenced from:
      _moveMouse in ccVkh5f7.o
      _toggleMouse in ccVkh5f7.o
  "_CGEventGetLocation", referenced from:
      _getMousePos in ccVkh5f7.o
  "_CGEventPost", referenced from:
      _moveMouse in ccVkh5f7.o
      _toggleMouse in ccVkh5f7.o
  "_deadbeef_rand", referenced from:
      _smoothlyMoveMouse in ccVkh5f7.o
  "_getMainDisplaySize", referenced from:
      _smoothlyMoveMouse in ccVkh5f7.o
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

これにより、根本的な問題が明らかになりますか?

4

1 に答える 1

2

Mac の問題は、さまざまなフレームワークを使用するコードをコンパイルしていて、それらのフレームワークをリンクしていないことです。_CFReleaseCoreFoundation、_CGEventCreateQuartzなどから来ています。

だから、ただ書くことはできませんgcc mouse.c。たとえば、 と書くと、gcc mouse.c -framework CoreFoundationいくつかのエラーが消えることがわかります。適切なフラグをすべて追加すると、それらがすべて消えることがわかります。

Mac では、おそらくあなたmouse.c(またはそれが使用するヘッダー) にこれらのフレームワークのヘッダー ファイルが既に含まれているか、コンパイルさえされていないため、これらのリンカー エラーが発生することさえありません。その場合、どのフレームワークを含める必要があるかを推測するのは非常に簡単#include <CoreFoundation/CoreFoundation.h>です-framework CoreFoundation

または、Apple の開発者向けドキュメントで、失敗した各機能を検索することもできます。各ページの上部に、欠落している関数がどのフレームワークにあるかが表示されます。

他にも入れたいものがきっとあるはずです。たとえば、各ユーザーがビルドするソースではなく、バイナリを配布する場合は、ローカル ファイルではなく、SDK に対してビルドする必要があります。


しかし、他のすべてのプラットフォームでもまったく同じ問題が発生するため、そこでも解決する必要があります。また、他のプラットフォームにはフレームワークがありません。-lLinux では、ヘッダー ファイルとライブラリの間に明らかに 1 対 1 のマッピングはありません。

明らかautopyに、この問題はすでに解決されているため、その setup.py/configure/Makefile/whatever は、各プラットフォームでリンクする必要があるすべてのことを既に示しています (ただし、必要のない他のものがたくさん含まれている場合があります) 。 .


最後のエラーは少し異なります。関数を定義していないと不平を言っていmainます。すべての C プログラムにはmain関数が必要です。(プログラムの代わりに静的ライブラリまたは共有ライブラリを構築しようとしていた場合は、GCC にそのように指示する必要があります。)


ここでは、OS X で動作するようにハッキングされたバージョンを確認できます。

于 2013-09-18T21:52:12.957 に答える