3 votos

Problemas al usar make - usb.h no se encuentra

Estoy tratando de usar make para construir un binario a partir del código fuente de un programa que necesito.

Enlace a la fuente: https://github.com/pali/0xFFFF

Requiere usb.h, que parece ser parte de usblib-compat. He instalado este último por brew install usblib-compat . Pero todavía usb.h no se puede ver, aunque sé dónde está (bajo /usr/local/Cellar/usblib-compat/version/include).

He leído mucho por Internet y he intentado configurar muchas variables de entorno, pero sin éxito. ¿Alguna idea?

ACTUALIZACIÓN

Después de muchas pruebas, he progresado de alguna manera. A saber, el archivo config.mk se lee claramente durante el proceso de make'ing, aunque tengo que admitir que no me queda claro cómo se hace; de todos modos, me di cuenta de dos líneas comentadas:

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

Los descomenté y ahora pasa algo: se encuentra el usb.h. Creo que la primera de estas definiciones de variables le dice al compilador dónde buscar los archivos de cabecera, y la segunda le dice al enlazador dónde buscar las bibliotecas - pero de nuevo no me queda del todo claro.

En cualquier caso, sigo teniendo problemas. Concretamente, el proceso de make'ing emite dos advertencias y un error, y luego se detiene:

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") )

Parece que este programa es difícil de portar de Linux a Mac, aunque creo que debería ser portable. Si alguien tiene alguna idea sobre qué hacer (aparte de ejecutar una distribución de Linux...), se agradecería mucho.

0 votos

En la página de manual de dlsym() (en MacOS Sierra 10.12.3), dice: _Si dlsym() se llama con el manejador especial RTLD_DEFAULT, entonces todas las imágenes mach-o del proceso (excepto las cargadas con dlopen(xxx, RTLD_LOCAL) ) se buscan en el orden en que fueron cargados. Esto puede ser una búsqueda costosa y debe evitarse._ Por lo tanto, debería obtener el símbolo definido si incluye <dlfcn.h> a menos que haya conseguido especificar (directa o indirectamente) un #define que impide que se especifique el símbolo.

0 votos

@JonathanLeffler En usb-device.c He encontrado lo siguiente: 21 #ifndef _GNU_SOURCE 22 #define _GNU_SOURCE 23 #endif 24 25 #include <stdio.h> 26 #include <stdlib.h> 27 #include <stdint.h> 28 #include <string.h> 29 #include <errno.h> 30 #include <ctype.h> 31 #include <signal.h> 32 #include <dlfcn.h> Así que dlfcn.h parece que ya está incluido, y también _GNU_source lo que debería permitir la definición de RTLD_DEFAULT .

4voto

Jose Chavez Puntos 645

No has dicho qué programa quieres compilar, así que es imposible dar un consejo específico.

El consejo general es buscar en el README del programa, en la documentación y/o en el Makefile la forma de especificar la ruta de inclusión.

Por ejemplo, puede editar el Makefile directamente para identificar dónde se especifica la ruta de inclusión. En muchos proyectos el programa es compilado por gcc/llvm y las rutas de inclusión se especifican usando argumentos "-I" al compilador.

Podrías encontrar ese lugar en el Makefile y añadir:

  -I/usr/local/Cellar/usblib-compat/version/include

0 votos

Enlace al programa: github.com/pali/0xFFFF . He echado un vistazo al Makefile pero no veo dónde se invoca a ningún compilador.

0 votos

Es porque el Makefile de nivel superior no hace nada más que invocar el Makefile dentro del directorio src, desde donde se invoca al compilador. Sin embargo, el proyecto tiene un archivo config.mk en el directorio de nivel superior con un ejemplo de cómo especificar la ruta de inclusión. Sólo hay que eliminar la marca # de la línea CPPFLAGS, y cambiar /usr/pkg/include por /usr/local/Cellar/usblib-compat/versión/include.

0 votos

Gracias, me di cuenta por mí mismo... Pero de todos modos esto no fue suficiente. Se han necesitado muchos otros trucos. ¡Pero he tenido éxito! Se publicará una respuesta extensa aquí en unos minutos.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X