2017-03-08 294 views
1

我試圖在Mac OS X(El Capitan)下使用make編譯我知道在Linux下工作的程序。該程序使用USB庫。我不得不修改config.mk文件來找到這些庫,但是現在我最終在編譯時出現了錯誤(未聲明的標識符)。在Mac OS X下編譯Linux程序

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

它需要usb.h,這似乎是usblib-COMPAT的一部分。我安裝了後者brew install usblib-compat。但仍然無法看到usb.h,但我知道它在哪裏:具體而言,usb.h和庫的符號鏈接可分別在/ usr/local/include和/ usr/local/lib下找到。

經過多次試驗,我以某種方式進步。也就是說,在製作過程中,文件config.mk被清晰地讀取,但我不得不承認,我不清楚這是如何完成的;反正,我注意到兩行註釋:(。爲精確起見,在原config.mk的本地目錄是由PKG DIR取代我取代了它在這幾行)

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

我取消了他們的評論,現在發生了一些事情:找到了usb.h。我認爲這些變量定義中的第一個告訴編譯器在哪裏查看頭文件,第二個告訴鏈接器在哪裏查找庫 - 但是這一點對我來說並不完全清楚。

無論如何,我仍然有問題。也就是說,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發行版...),它將不勝感激。

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庫中 - 你應該沒問題。如果代碼使用僅限Linux的調用或Linux和Mac之間不同的調用,則必須在端口上更加努力。我不相信在[Ask Different](https://apple.stackexchange.com)上的人會在題目上考慮這個問題。 USB庫從哪裏來?這些東西很容易成爲系統特定的。 –

+0

@AnttiHaapala編輯了所有細節。它是否仍然處於等待狀態? – Enrico

回答

1

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

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

這樣做有兩種可能性。第一個也是最明顯的是通過home brew安裝libusb-1.0和libusb-compat(後者爲使用libusb-0.1的程序提供了一個兼容界面,libusb-0.1是libusb的第一個版本,與libusb不兼容-1.0。usb。h包含在libusb-compat中):

brew install libusb 
brew install libusb-compat 

但是,這會導致其他問題,如其他答案中所報告的。我曾圍繞過他們,但最終發現我的程序在使用libusb-compat時很生氣(如果我理解正確,通過兩層庫連接USB端口對於閃存器來說太慢)。

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

sudo port install libusb-legacy 

好了,現在打電話讓會不是做的伎倆,因爲編譯器無法找到該庫。爲此,我必須編輯包含在程序主目錄中的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定義由庫定義其他變量所需的環境變量。在Makefile中的src目錄,其實_POSIX_C_SOURCE定義。)

你覺得這一切都做了工作?不。事實上,在這一點上,我結束了另一個錯誤:鏈接器無法找到一些名爲-lusb的庫。我不知道爲什麼這個語法,但經過一番思考,我意識到,-lusb對於libusb來說有點短暫。我使用的libusb實際上叫做libusb-legacy ...因此,我進入了src目錄中的Makefile,其中引入了-lusb,並將-lusb更改爲-lusb-compat。 TAH-DAH!編譯。關於未使用變量的一些警告以及兩種不同類型整數之間的比較,但僅此而已。程序運行 - 經過幾次試驗後,我已經能夠重新刷新我現在活着的磚頭電話!很高興!!! :)

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

我同意。我會在makefile中添加-D開關,是否正確?如果是,那究竟該怎麼做? – Enrico

+0

@Enrico是否這樣? –