在Mac OS X下编译Linux程序

时间:2017-03-08 07:23:33

标签: c linux macos compiler-errors

我正在尝试在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,虽然我不得不承认我不清楚这是如何完成的;无论如何,我注意到两行评论:

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

(为了精确起见,在原始的config.mk中,本地目录被pkg dir替换。我在这些行中替换了它。)

我取消注释它们,现在发生了一些事情:找到了usb.h。我认为这些变量定义中的第一个告诉编译器在哪里查看tor头文件,第二个告诉链接器在哪里寻找库 - 但是我再也不清楚了。

无论如何,我还有问题。即,制作过程输出两个警告和一个错误,然后停止:

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

2 个答案:

答案 0 :(得分:1)

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

所以,第一点是:如果我在程序的主文件夹中运行make,则找不到usb.h。然后,我们必须安装相应的库。

这有两种可能性。第一个也是更明显的是通过家庭酿造安装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命令行实用程序(这需要先去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。 TAH-DAH!编译。关于未使用变量的一些警告以及两种不同类型的整数之间的比较,但仅此而已。程序运行 - 经过几次试验,我已经能够重新刷新我的砖块手机了,现在又恢复了活力!很高兴!!! :)

答案 1 :(得分: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