[英]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.