簡體   English   中英

在 Mac OS X 下編譯 Linux 程序

[英]Compiling a Linux program under Mac OS X

我正在嘗試在 Mac OS X (El Capitan) 下使用make來編譯我知道可以在 Linux 下工作的程序。 該程序使用 USB 庫。 我必須修改 config.mk 文件才能找到這些庫,但現在我最終在編譯中出現錯誤(未聲明的標識符)。

源鏈接: https : //github.com/pali/0xFFFF

它需要 usb.h,它似乎是 usblib-compat 的一部分。 我通過brew install usblib-compat安裝了后者。 但是仍然無法看到 usb.h,雖然我知道它在哪里:具體來說,可以分別在 /usr/local/include 和 /usr/local/lib 下找到指向 usb.h 和庫的符號鏈接.

經過多次嘗試,我以某種方式取得了進步。 也就是說,文件 config.mk 在 make'ing 過程中被清楚地讀取,盡管我不得不承認我不清楚這是如何完成的; 無論如何,我注意到有兩行評論:

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

(為了精確起見,在原始 config.mk 中,本地目錄被 pkg 目錄替換。我在這些行中替換了它。)

我取消了它們的注釋,現在發生了一些事情:找到了 usb.h。 我認為這些變量定義中的第一個告訴編譯器在哪里查找 tor 頭文件,第二個告訴鏈接器在哪里查找庫 - 但我又不完全清楚。

無論如何,我仍然有問題。 即 make'ing 過程輸出兩個警告和一個錯誤,然后停止:

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 發行版......),我們將不勝感激。

編輯

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 */

好吧,我終於成功了。 我認為值得發布我的解決方案 - 也許其他人會發現它很有用。

所以,第一點是:如果我在程序的主文件夾中運行 make ,則找不到 usb.h 。 然后,我們要安裝相應的庫。

要做到這一點有兩種可能性。 第一個也是更明顯的是通過 home brew 安裝 libusb-1.0 和 libusb-compat(后者為使用 libusb-0.1 的程序提供了兼容接口,這是 libusb 的第一個版本,與 libusb 不兼容-1.0. usb.h 包含在 libusb-compat 中):

brew install libusb
brew install libusb-compat

但是,這會導致其他問題,如其他答案中所述。 我已經解決了它們,但最終發現我的程序在使用 libusb-compat 時很生氣(如果我理解正確,通過兩層庫連接 USB 端口對於 flasher 來說太慢了)。

所以,另一種可能性:安裝實際的 libusb-0.1。 這是不是可以通過家庭釀造。 然而,它可以通過端口獲得,名稱為 libusb-legacy。 所以,我必須安裝端口,安裝 X-code 命令行實用程序(這需要首先訪問 Apples 的網站以接受他們的合法內容......)並運行

sudo port install libusb-legacy

好的,現在調用 make不會成功,因為編譯器還不能找到庫。 為此,我必須編輯包含在程序主目錄中的 config.mk 文件,取消最后兩行的注釋,並稍微編輯它們以指向存儲 libusb-legacy 的目錄:

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

(-D_DARWIN_C_SOURCE定義了庫定義的其他變量所需的環境變量。在src目錄下的Makefile中,其實定義了_POSIX_C_SOURCE。)

你認為這一切都奏效了嗎? 不。事實上,此時我遇到了另一個錯誤:鏈接器無法找到一些名為 -lusb 的庫。 我不知道為什么使用這種語法,但經過一番思考后,我意識到 -lusb 是 libusb 的縮寫。 而我使用的libusb其實叫做libusb-legacy……於是我進入src目錄下的Makefile,里面引入了-lusb,將-lusb改成了-lusb-compat。 噠噠! 編譯。 關於未使用變量的一些警告以及兩種不同類型整數之間的比較,僅此而已。 程序運行 - 經過幾次試驗,我已經能夠重新刷新我的磚砌手機,現在它又活了! 很高興!!! :)

綜觀dlfcn.h的源代碼,似乎該標識符只被定義如果_POSIX_C_SOURCE沒有定義,或_DARWIN_C_SOURCE定義。 因此,我只需添加#define _DARWIN_C_SOURCE ;

或者您可以在 config.mk 中添加相應的-D開關:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM