gpt4 book ai didi

在 Mac OS X 下编译 Linux 程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:41:09 34 4
gpt4 key购买 nike

我正在尝试在 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 和库的符号链接(symbolic link).

经过多次尝试,我有所进步。也就是说,在制作过程中可以清楚地读取文件 config.mk,尽管我不得不承认我不清楚这是如何完成的;不管怎样,我注意到有两行评论:

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

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

我取消了它们的注释,现在发生了一些事情:找到了 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 */

最佳答案

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

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

有两种可能性可以做到这一点。第一个也是更明显的是通过 home brew 安装 libusb-1.0 和 libusb-compat(后者为使用 libusb-0.1 的程序提供兼容接口(interface),这是 libusb 的第一个版本,与 libusb 不兼容-1.0. usb.h 包含在 libusb-compat 中):

brew install libusb
brew install libusb-compat

但是,这会导致其他问题,如其他答案中所述。我曾解决过这些问题,但最终发现我的程序在使用 libusb-compat 时很生气(如果我理解正确的话,通过两层库连接 USB 端口对于闪光灯来说太慢了)。

那么,另一种可能性:安装实际的 libusb-0.1。这可以通过家庭酿造获得。但是它可以通过端口使用,名称为 libusb-legacy。所以,我必须安装 ports,安装 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。哒哒!编译。一些关于未使用变量的警告和两种不同类型整数之间的比较,仅此而已。程序运行 - 经过几次试验,我已经能够刷新我的砖手机,现在又活了!很高兴!!! :)

关于在 Mac OS X 下编译 Linux 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42665285/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com