If for any reason you need to cross-compile any application for MIPS architecture for OpenWrt but without the project’s compiling tools, you can follow the next steps:
- Find the OpenWrt toolchain for MIPS. From the directory you downloaded OpenWrt execute::
- Export the following variables, taking in account the absolute path of the toolchain (I put my PC’s settings as example):
- Then you can compile Makefile and autotools projects by typing this in the source directory:
find -name *toolchain-mips* ./staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1
Note: You must have compiled something in this architecture in order to have the toolchain available.
export TOOLCHAIN_PATH=/home/lgallard/backfire/staging_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1 export PATH=$PATH:$TOOLCHAIN_PATH/usr/bin/ export AR=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ar export AS=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-as export LD=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ld export NM=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-nm export CC=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-gcc export CPP=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-cpp export GCC=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-gcc export CXX=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-g++ export RANLIB=$TOOLCHAIN_PATH/usr/bin/mips-openwrt-linux-uclibc-ranlib
./configure --target=mips-openwrt-linux --host=mips-openwrt-linux
Referencia: Cross-compile for WRT

Planeta Linux
#1 by Luis Gallardo on 13/09/2011 - 2:44 pm
@Sergio de mi experiencia cross-compilando esto puede ser:
1. No tienes bien las referencias de los headers y librerías. Asegúrate de incluir las rutas para los headers con -I y las librerías con -L, además de indicar que tu programa/librería usa la librería resolv con la opción -lresolv.
2. Estás usando headers y librerías para otras arquitecturas. Los headers y librerías que encuentras en tu PC sirven para x86, por ende necesitaras las versiones para la arquitectura que desees crsoss-compilar.
3. Suponiendo que tienes bien las referencias, si estás usando una librería de un tercero, esta debe también estar compilada para la arquitectura a la que quieres cross-compilar. Una opción es conseguir los binarios ya compilados para dicha arquitectura o descargar las fuentes y compilar lo que necesites primero para la arquitectura en cuestión. Por ejemplo, si libUpTools es la librería a enlazar, primero debes cross-compilarla y usar esa como referenica en 1)
4. Si libUpTools es una librería estándar, debes revisar que el tool-chain de OpenWrt la incluya y que todas las funciones estén implementadas. Para que te des una idea, me pasó que hice un programa que enlazaba a math.h y funcionaba bien en x86 pero para MIPS no funcionaba, y todo porque la función abs() no está implementada en el tool-chain de OpenWrt porque consideraron innecesarias ciertas funciones matemáticas para OpenWrt (hay que recordar que al final es una distro para routers).
Espero que te sirva de ayuda. Saludos!
#2 by Sergio on 13/09/2011 - 12:41 pm
Hola Luis, estoy queriendo compilar una librería y unos binarios de ejemplo contra la misma usando la toolchain de OpenWRT y me da error, estos son:
UpResolverSimple.cc:(.text+0x4dc): undefined reference to `__ns_get16′
./.libs/libUpTools.a(UpDnsQuerySimple.o): In function `UpDnsQuerySimple::getFirst() const’:
UpDnsQuerySimple.cc:(.text+0×698): undefined reference to `__ns_parserr’
./.libs/libUpTools.a(UpDnsQuerySimple.o): In function `UpDnsQuerySimple::getNext() const’:
UpDnsQuerySimple.cc:(.text+0×794): undefined reference to `__ns_parserr’
./.libs/libUpTools.a(UpDnsQuerySimple.o): In function `UpDnsQuerySimple::initialResponseParse()’:
UpDnsQuerySimple.cc:(.text+0xa94): undefined reference to `__ns_initparse’
./.libs/libUpTools.a(UpDnsQuerySimple.o): In function `UpDnsQuerySimple::prepare()’:
UpDnsQuerySimple.cc:(.text+0xb38): undefined reference to `__res_mkquery’
UpDnsQuerySimple.cc:(.text+0xb44): undefined reference to `__ns_get16′
es como la librería resolv no tiene todos los símbolos… alguna idea?
#3 by Luis Gallardo on 26/07/2011 - 8:14 am
@Borja esos mensajes pueden ser porque en el Makefile o .config se puede configurar las herramientas para cross-compilar. En ese caso deberías poner la ruta donde está mips-openwrt-linux-gcc. Si no te resulta, pásame el enlace de lo que quieres compilar para probar. Saludos!
#4 by Borja on 26/07/2011 - 7:12 am
Sí, sí. Además, con el tema de las variables, si hago, por ejemplo, un ‘echo $GCC’ me escribe /home/borjagt/backfire/stagin_dir/toolchain-mips_r2_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin/mips-openwrt-linux-gcc. En cambio, durante la compilación del jamVM aparece:
bla bla bla…
checking build system type… i686-pc-linux-gnu
checking host system type… mips-openwrt-linux-gnu
checking target system type… mips-openwrt-linux-gnu
checking for a BSD-compatible install… /usr/bin/install -c
checking whether build environment is sane… yes
checking for a thread-safe mkdir -p… /bin/mkdir -p
checking for gawk… gawk
checking whether make sets $(MAKE)… yes
checking for mips-openwrt-linux-strip… no
checking for strip… strip
checking how to create a ustar tar archive… gnutar
checking for style of include used by make… GNU
checking for mips-openwrt-linux-gcc… no <—– ESTO !!!!!!
checking for gcc… gcc
checking for C compiler default output file name… a.out
checking whether the C compiler works… yes
checking whether we are cross compiling… no <—– ESTO !!!!!!
bla bla bla…
checking for a BSD-compatible install… /usr/bin/install -c
checking for mips-openwrt-linux-g++… no <—– y todo ESTO !!!!!!
checking for mips-openwrt-linux-c++… no
checking for mips-openwrt-linux-gpp… no
checking for mips-openwrt-linux-aCC… no
checking for mips-openwrt-linux-CC… no
checking for mips-openwrt-linux-cxx… no
checking for mips-openwrt-linux-cc++… no
checking for mips-openwrt-linux-cl.exe… no
checking for mips-openwrt-linux-FCC… no
checking for mips-openwrt-linux-KCC… no
checking for mips-openwrt-linux-RCC… no
checking for mips-openwrt-linux-xlC_r… no
checking for mips-openwrt-linux-xlC… no
checking for g++… g++
checking whether we are using the GNU C++ compiler… yes
bla bla bla…
alguna idea???
#5 by Luis Gallardo on 25/07/2011 - 5:48 pm
@Borja colocaste –target=mips-openwrt-linux –host=mips-openwrt-linux (son dos guiones en cada caso) ?
#6 by Borja on 25/07/2011 - 5:41 pm
Hola, antes que nada gracias por responder tan pronto! ;-)
He seguido los pasos: he descargado via subversion el openwrt backfire, con make menuconfig he indicado Target System (Atheros AR71xx/AR7240/AR913x), y Target Profile (Ubiquiti RouterStation Pro). Tambien he marcado la opción Build openwrt based toolchain. Finalmente he salido del menu y ejecuto make.
Todo correcto sin errores.
Entiendo que ya tengo los toolchain (de hecho aparecen en la ruta que indicas en el articulo). Pero al querer compilar el jamVM con ./configure –target=mips-openwrt-linux –host=mips-openwrt-linux, me da como resultado: Invalid configuration ‘mips-openwrt-linux-gcc’: machine ‘mips-openwrt-linux-gcc’ not recognized.
¿Qué hago mal? ¿Qué me he dejado?
Ayuda por favor. Gracias.
#7 by Luis Gallardo on 25/07/2011 - 8:53 am
@Borja para hacer lo que quieres basta con bajarte las fuentes de OpenWrt y compilar el paquete de java en una imagen nueva. Puedes seguir los pasos explicados aquí de cómo construir una imagen de Opewrt.
Este artículo habla de cómo cross-compilar fuera de las herramientas de OpenWrt pero usando el toolchain que viene en la imagen de OpenWrt.
Saludos!
#8 by Borja on 25/07/2011 - 8:12 am
Hola.
Estoy intentando compilar e instalar el jamVM en una RouterStation Pro de Ubiquiti para ejecutar programas Java. Después de mucho googlear he llegado a la conclusión que debo hacer compilación cruzada. Pero soy bastante nuevo en Linux y algunos conceptos se me escapan.
Siguiendo el ejemplo del artículo: ¿debo hacerlo en la routerstation o en mi PC con Ubuntu? He probado los dos y en ninguno tengo el toolchain-mips. ¿Donde se consigue?
Gracias por adelantado.