在Mac OS X下编译Linux程序

问题描述:

我试图在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

好吧,我终于获得了成功。我认为值得发布我的解决方案 - 也许其他人会发现它很有用。

因此,第一点是:如果我在程序的主文件夹中运行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!编译。关于未使用变量的一些警告以及两种不同类型整数之间的比较,但仅此而已。程序运行 - 经过几次试验后,我已经能够重新刷新我现在活着的砖头电话!很高兴!!! :)

综观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是否这样? –