2017-03-08 26 views
1

Mac OS X(El Capitan)でmakeを使用して、Linuxで動作するプログラムをコンパイルしようとしています。プログラムはUSBライブラリを利用します。私はこれらのライブラリが見つかるようにconfig.mkファイルを修正しなければならなかったが、今はコンパイル(宣言されていない識別子)でエラーに終わる。ソースへMac OS XでLinuxプログラムをコンパイルする

リンク:https://github.com/pali/0xFFFF

それはusblib-compatの一部のように思われ、usb.hが必要です。私はbrew install usblib-compatで後者をインストールしました。しかし、usb.hとライブラリのシンボリックリンクは、それぞれ/ usr/local/includeと/ usr/local/libにあります。 。

多くの試験の後、何とか進歩しました。つまり、config.mkというファイルはmakeの処理中にはっきりと読み込まれますが、これがどのように行われたかはわかりません。とにかく、私は2つの行はコメントに気づい:(。。精度のために、オリジナルのconfig.mkにローカルディレクトリは、PKGのディレクトリに置き換えられました、私はこれらの行でそれを置き換える)

CPPFLAGS += -I/usr/local/include 
LDFLAGS += -L/usr/local/lib -Wl,-R/usr/local/lib 

私はそれらのコメントを外し、何かが起こった:usb.hが見つかりました。私は、これらの変数定義の最初のものは、ヘッダファイルをどこで探すべきかをコンパイラに伝え、2つ目はライブラリを探す場所をリンカに教えてくれると思いますが、もう一度私には分かりません。

いずれにしても、私はまだ問題があります。すなわち、make'ingプロセスは、2つの警告やエラーを出力し、その後、停止します。私はそれが移植されるべきだと思うが、

usb-device.c:90:57: warning: unused parameter 'udev' [-Wunused-parameter] 
static void usb_reattach_kernel_driver(usb_dev_handle * udev, int interface) { 
                 ^
usb-device.c:90:67: warning: unused parameter 'interface' [-Wunused-parameter] 
static void usb_reattach_kernel_driver(usb_dev_handle * udev, int interface) { 

usb-device.c:324:13: error: use of undeclared identifier 'RTLD_DEFAULT' if (dlsym(RTLD_DEFAULT, "libusb_init")) 

は、このプログラムは、LinuxからMacにポートすることは困難であるようです。誰かが(Linuxディストリビューションを運営しているのとは別に)何をすべきかについて考えがあれば、それは非常に感謝しています。

EDIT

dlfcn.hには、以下があります。

#if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE) 
#define RTLD_NOLOAD 0x10 
#define RTLD_NODELETE 0x80 
#define RTLD_FIRST 0x100 /* Mac OS X 10.5 and later */ 
/* 
* Special handle arguments for dlsym(). 
*/ 
#define RTLD_NEXT  ((void *) -1) /* Search subsequent objects. */ 
#define RTLD_DEFAULT ((void *) -2) /* Use default search algorithm. */ 
#define RTLD_SELF  ((void *) -3) /* Search this and subsequent objects (Mac OS X 10.5 and later) */ 
#endif /* not POSIX */ 
+0

これは自由な質問ではありません!あなたは何をコンパイルしようとしているのか、何を変更したのか、エラーコードのコピーのコピー、コンパイラコマンドなどを伝える必要があります。 apple.seにリンクするだけでは不十分です –

+0

どのUSBライブラリですか?これらのライブラリはデフォルトでMac上で利用できますか?ライブラリをMacに移植しましたか?コードがLinux特有の関数呼び出しを掘り下げない場合(プログラム内であろうとUSBライブラリ内であろうと)、あなたはOKであるはずです。コードがLinuxのみの呼び出しを使用している場合や、LinuxとMacで異なる呼び出しを使用している場合は、そのポートでさらに作業する必要があります。私は[Ask Different](https://apple.stackexchange.com)の人たちがその質問をトピックとみなしているとは確信していません。 USBライブラリはどこにありますか?そのようなことは、システム固有のものになりがちです。 –

+0

@AnttiHaapalaすべての詳細を編集しました。それはまだ保留にする必要がありますか? – Enrico

答えて

1

[OK]を、最終的に私は成功しています。私は自分のソリューションを公開する価値があると思います。他の人が役に立つと思うかもしれません。

最初の点は、プログラムのメインフォルダ内でmakeを実行すると、usb.hが見つからないということです。次に、対応するライブラリをインストールする必要があります。

これには2つの可能性があります。 libusb-1.0とlibusb-compatをインストールすることです(後者は、libusbの最初のバージョンであるlibusb-0.1を使用し、libusbと互換性がないプログラムの互換インタフェースを提供します) -1.0 usb。hは)のlibusb-compatの中に含まれています。他の回答で報告されているように

brew install libusb 
brew install libusb-compat 

しかし、これは、他の問題につながります。私は彼らの周りで働いていたが、最終的に私のプログラムがlibusb-compatを使用するときに怒っていることを知った(私が正しく理解していれば、ライブラリの2つの層を通してusbポートをインターフェースすることはフラッシャーにとって遅すぎる)。

他の可能性:実際のlibusb-0.1をインストールする。これはで、ではなく、自家製です。しかし、libusb-legacyの名前でポート経由で利用できます。だから、私はと希望を作る呼び出す今、

sudo port install libusb-legacy 

[OK]を実行します(最初の...その法的なものを受け入れるようにリンゴのウェブサイトに行く必須です)X-codeコマンドラインユーティリティをインストールし、ポートをインストールする必要がありましたではなく、コンパイラがまだライブラリを見つけることができないので、このトリックはありません。そのためには、プログラムのメインディレクトリにあるconfig.mkファイルを編集し、最後の2行のコメントを外して、libusb-legacyが格納されているディレクトリを指し示すように編集しなければなりませんでした。

CPPFLAGS += -I/opt/local/include/libusb-legacy -D_DARWIN_C_SOURCE 
LDFLAGS += -L/opt/local/lib/libusb-legacy 

(-D_DARWIN_C_SOURCEでは、ライブラリが定義される他の変数のために必要な環境変数を定義します。Makefileのsrcディレクトリに、実際には、_POSIX_C_SOURCEが定義されている。)

あなたはこのすべてがやったと思いますかジョブ?いいえ。実際、この時点で私は別のエラーで終わってしまいました。リンカーは-lusbというライブラリを見つけることができませんでした。私はなぜこの構文がわからないのですが、いくつかの考えの後、私は-lusbがlibusbのために少し短いことに気付きました。私が使用しているlibusbは、実際にはlibusb-legacyと呼ばれています。そこで、srcディレクトリのMakefileに入りました。-lusbが導入され、-lusbが-lusb-compatに変更されました。タハダ!コンパイル済み。使用されていない変数と2つの異なるタイプの整数間の比較についての警告ですが、これ以上は何もありません。プログラムが実行されます - いくつかの試行の後、私は再び今生きている私のレンガの電話をリフラッシュすることができました!とても幸せ!!! :)

0

dlfcn.h source codeを見ると、_POSIX_C_SOURCEが定義されていない、または_DARWIN_C_SOURCEを定義している場合にのみ、識別子が定義されているようです。したがって、私はちょうど#define _DARWIN_C_SOURCEを追加したいと思います。

それとも、config.mkに対応する-Dスイッチを追加することができます。

CPPFLAGS += -I/usr/local/include -D_DARWIN_C_SOURCE 
+0

私は同意します。私はメイクファイルに-Dスイッチを追加します、それは正しいですか?はいの場合、どのように正確に行うのですか? – Enrico

+0

@Enricoこれは好きですか? –