交叉編譯去掉warning
1. 請問什麼是交叉編譯跟本地編譯有什麼區別拜託各位大神
你那個代碼很可能是在pc平台上交叉編譯到arm設備上的。這樣你可以在pc上修改程序,然後pc上編譯,最後把編譯的結果下載到arm中就可以運行了。不知道你說的本地編譯是什麼意思,通常所說的那種本地編譯就是編譯的結果還是在pc上運行,如果你期望的是這個的話,可以考慮修改一下編譯器的參數,查一下gcc的說明就知道哪個參數是指定交叉編譯平台的,把那個參數去掉就是本地編譯了。但是,需要注意的是,這樣多半不能成功運行,因為交叉編譯到arm上的一般是基於某種特殊的linux平台的,即使你使用了linux平台,其中可能有一些函數也會不同的。。。
2. 安裝好了交叉編譯環境, 編譯minigui程序時, 報錯. 怎麼辦
提示是未定義的引用, 你先檢查 In file included from /usr/local/include/minigui/endianrw.h:357,
from /usr/local/include/minigui/gdi.h:5353,
from taskbar.c:37:
/usr/include/asm/byteorder.h:6:2: warning: #warning using private kernel header; include <endian.h> instead!
這幾個頭文件問題,告訴你多少行了。查查看。 交叉編譯注意編譯器,頭文件,路徑等環境的設置。 如果還不能解決,請到minigui 的官方網站瀏覽一下。
3. 交叉編譯libnpg庫 ./configure CC=mipsisa32-elf-gcc --host=mipsisa32-linux 求大神給予幫助
編譯安裝。關鍵要看configure後,屏幕上出現的那一堆內容的最末尾有沒有error:
沒有就可以進行下一步。至於其他的,例如warning,可以忽略。
make和make install也是一樣
4. Qt creator交叉編譯帶圖片的程序出現問題,版本4.7
找不到 libQtGui.so 這個庫, 添加環境變數 LIBRARY_PATH=/opt/Qt4.7/lib 試試
另外你使是用 arm-linux-gcc 編譯程序, 需要保證 QT 下的 libQtGui.so 庫也是用 arm-linux-gcc 編譯的, 否則編譯鏈接會出問題
5. 在ubantu12.04版本環境下,使用交叉編譯工具編譯opencv,老出現這個問題,求大神指教!
整個項目的結構圖:
編寫DetectFaceDemo.java,代碼如下:
[java] view
plainprint?
package com.njupt.zhb.test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
public class DetectFaceDemo {
public void run() {
System.out.println("\nRunning DetectFaceDemo");
System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath());
// Create a face detector from the cascade file in the resources
// directory.
//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());
//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());
//注意:源程序的路徑會多列印一個『/』,因此總是出現如下錯誤
/*
* Detected 0 faces Writing faceDetection.png libpng warning: Image
* width is zero in IHDR libpng warning: Image height is zero in IHDR
* libpng error: Invalid IHDR data
*/
//因此,我們將第一個字元去掉
String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);
CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);
Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// Save the visualized detection.
String filename = "faceDetection.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
}
}
package com.njupt.zhb.test;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
public class DetectFaceDemo {
public void run() {
System.out.println("\nRunning DetectFaceDemo");
System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath());
// Create a face detector from the cascade file in the resources
// directory.
//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());
//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());
//注意:源程序的路徑會多列印一個『/』,因此總是出現如下錯誤
/*
* Detected 0 faces Writing faceDetection.png libpng warning: Image
* width is zero in IHDR libpng warning: Image height is zero in IHDR
* libpng error: Invalid IHDR data
*/
//因此,我們將第一個字元去掉
String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);
CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);
Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// Save the visualized detection.
String filename = "faceDetection.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
}
}
3.編寫測試類:
[java] view
plainprint?
package com.njupt.zhb.test;
public class TestMain {
public static void main(String[] args) {
System.out.println("Hello, OpenCV");
// Load the native library.
System.loadLibrary("opencv_java246");
new DetectFaceDemo().run();
}
}
//運行結果:
//Hello, OpenCV
//
//Running DetectFaceDemo
///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml
//Detected 8 faces
//Writing faceDetection.png
package com.njupt.zhb.test;
public class TestMain {
public static void main(String[] args) {
System.out.println("Hello, OpenCV");
// Load the native library.
System.loadLibrary("opencv_java246");
new DetectFaceDemo().run();
}
}
//運行結果:
//Hello, OpenCV
//
//Running DetectFaceDemo
///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml
//Detected 8 faces
//Writing faceDetection.png
6. 如何解決在交叉編譯的問題的crt0.o
如何添加ctr0.o?我得到這個錯誤:
yagarto-4.7.2/bin/arm-none-eabi-ld: cannot find crt0.o: No such file or directory
collect2: error: ld returned 1 exit status`
離這里很簡單的程序:
/* -- first.s */
/* This is a comment */
.global main /* 'main' is our entry point and must be global */
.func main /* 'main' is a function */
main: /* This is main */
mov r0, #2 /* Put a 2 inside the register r0 */
bx lr /* Return from main */
我看這2個線程,並沒有得到任何完整的和直截了當的回答: 什麼是從背後取下gcc4.7.x的crt0.o的理由? 我有這些文件,什麼是CRT0和外箱之間的區別不就可以了?
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/crtn.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/crtn.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v6m/crtn.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crtbegin.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crtend.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crti.o
./yagarto-4.7.2/lib/gcc/arm-none-eabi/4.7.2/thumb/v7m/crtn.o
在SO解決方案給周圍的工作不工作了:
arm-none-eabi-gcc -o first assembler_tutorial/chapter01/first.o -nostartfiles
./yagarto-4.7.2/bin/arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000
本文地址 :CodeGo.net/603832/
-------------------------------------------------------------------------------------------------------------------------
1. vectors.s
.globl _start
_start:
mov sp,#0x8000
bl main
hang: b hang
main.s
.globl main
main:
mov r0,#2
bx lr
MEMMAP(鏈接腳本)
MEMORY
{
ram : ORIGIN = 0x8000, LENGTH = 0x10000
}
SECTIONS
{
.text : { *(.text*) } > ram
.bss : { *(.bss*) } > ram
}
命令
arm-none-eabi-as vectors.s -o vectors.o
arm-none-eabi-as main.s -o main.o
arm-none-eabi-ld vectors.o main.o -T memmap -o main.elf
arm-none-eabi-objmp -D main.elf > main.list
arm-none-eabi-obj main.elf -O binary main.bin
結果
main.elf: file format elf32-littlearm
Disassembly of section .text:
00008000 <_start>:
8000: e3a0d902 mov sp, #32768 ; 0x8000
8004: eb000000 bl 800c <main>
00008008 <hang>:
8008: eafffffe b 8008 <hang>
0000800c <main>:
800c: e3a00002 mov r0, #2
8010: e12fff1e bx lr
如果你想,而不是ASM主C,則 main.c中
int main ( void )
{
return(2);
}
命令
arm-none-eabi-as vectors.s -o vectors.o
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -c main.c -o main.o
arm-none-eabi-ld vectors.o main.o -T memmap -o main.elf
arm-none-eabi-objmp -D main.elf > main.list
arm-none-eabi-obj main.elf -O binary main.bin
結果
main.elf: file format elf32-littlearm
Disassembly of section .text:
00008000 <_start>:
8000: e3a0d902 mov sp, #32768 ; 0x8000
8004: eb000000 bl 800c <main>
00008008 <hang>:
8008: eafffffe b 8008 <hang>
0000800c <main>:
800c: e3a00002 mov r0, #2
8010: e12fff1e bx lr
我更喜歡其他的函數不是主要的編譯器添加額外的行李,當他們看到那個函數 vectors.s
.globl _start
_start:
mov sp,#0x8000
bl notmain
hang: b hang
main.c中
int notmain ( void )
{
return(2);
}
結果
main.elf: file format elf32-littlearm
Disassembly of section .text:
00008000 <_start>:
8000: e3a0d902 mov sp, #32768 ; 0x8000
8004: eb000000 bl 800c <notmain>
00008008 <hang>:
8008: eafffffe b 8008 <hang>
0000800c <notmain>:
800c: e3a00002 mov r0, #2
8010: e12fff1e bx lr
7. windows環境下eclipse c/c++編譯出現警告make: warning: Clock skew detected. Your build may be incompl
這個是說編譯器發現時間改變了,,告訴你可能編譯的東西不正確(注意,,是目標文件的版本),如果你知道makefile的話就應該知道 是怎麼回事了,,不過像ide都 是已經把makefile寫好的,,看看makefile就清楚 了,, 用touch命令試試看,好像是可以解決,,還有就是makefile是根據 時間來決定 某個源文件 是否被 編譯為目標文件,你如果改變了系統 時間就回出現這種 情況 ,,用虛擬機和SSH都 可能回去現這種 問題,,不過工程粘的話應該沒什麼問題,,如果想知道makefile是怎麼樣知道時間的,,這又得看inode節點了,,所以後面還是很麻煩的,,,有不知道的在問
8. 交叉編譯qt程序時出現「錯誤: 未知的轉義序列:『\Q』 」 請問如何解決。。。在x86上編譯只是警告。。
在C++中『\』是轉義字元。所以如果你不是用來轉義可以用『/』,如果你需要字元『\』,請使用「\\」代替『\』
9. 如何構建MIPS交叉編譯工具鏈
第一步 創建目錄以及環境變數
在當前用戶目錄下創建target-project文件夾,在該文件夾下創建mips-mole文件夾,在mips-mole文件夾下創建三個文件夾:build-tools,kernel,tools,最後,在build-tools文件夾下創建build-gcc,build-boot-gcc,build-glibc,build-binutils文件夾。命令如下:
$ cd ~
$ mkdir -p ./target-project/mips-mole/{kernel/,tools/,build-tools/{build-gcc,build-boot-gcc,build-glibc,build-binutils}}
$ tree ./target-project/mips-mole/
使用腳本構建環境變數
#! /bin/bash
注意修改/home/用戶名,修改正確後,使用source使腳本生效
$ cd target-project
$ chmod +x mips.sh
$ source mips.sh
可以使用echo査看相關變數名以觀察環境變數是否生效。
最後把linux-2.6.38.tar.bz2下載放置在kernel文件夾下,binutils-2.22.tar.gz,gcc-4.6.2.tar.gz,glibc-2.14.tar.gz,glibc-ports-2.14.tar.gz,gmp-5.0.4.tar.gz,mpc-0.9.tar.gz,mpfr-3.0.1.tar.gz下載放置在build-tools文件夾下。
第二步 安裝基於MIPS的linux頭文件
$ cd $PRJROOT/kernel
$ tar -xjvf linux-2.6.38.tar.bz2
$ cd linux-2.6.38
在指定路徑下創建include文件夾,用來存放相關頭文件。
$ mkdir -p $TARGET_PREFIX/include
保證linux源碼是干凈的。
$ make mrproper
生成需要的頭文件。
$ make ARCH=mips headers_check
$ make ARCH=mips INSTALL_HDR_PATH=dest headers_install
將dest文件夾下的所有文件復制到指定的include文件夾內。
$ cp -rv dest/include/* $TARGET_PREFIX/include
最後刪除dest文件夾
$ rm -rf dest
$ ls -l $TARGET_PREFIX/include
第三步 安裝binutils-2.22
$ cd $PRJROOT/build-tools
$ tar -xzvf binutils-2.22.tar.gz
$ cd build-binutils
$ ../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX
$ make
$ make install
再安裝automake。
$ tar -xzvf automake-1.11.1.tar.gz
$ cd automake-1.11.1
$ ./configure
$ make
$ sudo make install
下面開始修改相關文件,主要是去掉-Werror。
$ cd $PRJROOT/build-tools/binutils-2.22/gas
$ ge dit configure
將下面內容
# Enable -Werror by default when using gcc
if test "${GCC}" = yes -a -z "${ERROR_ON_WARNING}" ; then
ERROR_ON_WARNING=yes
fi
修改為
# Enable -Werror by default when using gcc
if test "${GCC}" = yes -a -z "${ERROR_ON_WARNING}" ; then
ERROR_ON_WARNING=no
fi
但是,需要重新configure生成Makefile.in。
$ ./configure (在binutils/gas路徑下的configure)
$ make distclean (切記)
然後重新執行第三步,這次編譯可過。
第四步 安裝gcc引導器
$ cd $PRJROOT/build-tools
$ tar -xzvf gcc-4.6.2.tar.gz
$ tar -xjvf gmp-5.0.4.tar.bz2
$ mv gmp-5.0.4 ./gcc-4.6.2/gmp
$ tar -xzvf mpc-0.9.tar.gz
$ mv mpc-0.9 ./gcc-4.6.2/mpc
$ tar -xzvf mpfr-3.0.1.tar.gz
$ mv mpfr-3.0.1 ./gcc-4.6.2/mpfr
$ cd build-boot-gcc
$ ../gcc-4.6.2/configure --target=$TARGET --prefix=$PREFIX --disable-shared <br>--without-headers --with-newlib --enable-languages=c --disable-decimal-float <br>--disable-libgomp --disable-libmudflap --disable-libssp --disable-threads --disable-multilib
編譯並安裝gcc引導器、libgcc庫。
$ make all-gcc
$ make all-target-libgcc
$ make install-gcc
$ make install-target-libgcc
第五步 編譯glibc
$ cd $PRJROOT/build-tools
$ tar xzvf glibc-2.14.tar.gz
$ cd glibc-2.14
刪除Makefonfig文件中的內容-lgcc_eh。
$ cp -v Makeconfig{,.b腸花斑拘職餃辦邪暴矛k}
$ sed -e 's/-lgcc_eh//g' Makeconfig.bk > Makeconfig
$ cd ..
$ tar -xjvf glibc-ports-2.14.tar.bz2
$ mv glibc-ports-2.14 ./glibc-2.14/ports
$ cd build-glibc
$ CC=mipsel-linux--gcc ../glibc-2.14/configure --host=$TARGET --prefix="/usr" <br>--enable-add-ons --with-headers=$TARGET_PREFIX/include libc_cv_forced_unwind=yes <br>libc_cv_c_cleanup=yes
注意:此時如何設置了LD_LIBRARY_PATH環境變數會configure error,需要刪除該變數重新configure。
$ make
$ make install_root=$TARGET_PREFIX prefix=」」 install
第六步 完全安裝gcc
首先,也是很重要的是去掉libc等庫文件的絕對路徑。
$ cd $TARGET_PREFIX/lib
備份一下。
$ cp libc.so libc.so.bk
$ gedit libc.so
將原內容
GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a AS_NEEDED ( /lib/ld.so.1 ) )
修改為
GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld.so.1 ) )
$ cp libpthread.so libpthread.so.bk
$ gedit libpthread.so
將原內容
GROUP ( /lib/libpthread.so.0 /lib/libpthread_nonshared.a )
修改為
GROUP ( libpthread.so.0 libpthread_nonshared.a )
然後可以完全編譯gcc。
10. 交叉編譯php問題,怎麼解決
因為目標板跟主機都是X86架構,正常來說,只要主機編譯通過並順利執行的程序,目標板應該也能順利,但這種不穩的方法,不妥當,於是決定還是為了心安,用交叉編譯工具來編譯程序
進入到php源代碼
CC=某某交叉編譯器 ./configure --prefix=/home/app/php --with-gd=/home/app/gd
gd我已經進行了交叉編譯,包含了jpeg,png,freetype等東西了,這里就略帶了
按照我上面的配置,產生了一個錯誤
configure: error: GD build test failed cross compile
提示說找不到GD組建,於是重新確定了一下路徑有沒錯,那當然是沒錯的啦
於是去除了交叉編譯器
./configure --prefix=/home/app/php --with-gd=/home/app/gd
這樣的配置,就能如常執行下去
最後實在沒辦法了,看一下配置日誌
vi config.log
發現以下信息
warning: libjpeg.so.62, needed by /home/app/gd/lib/libgd.so, not found (try using -rpath or -rpath-link)
庫問題,雖然編譯了jpeg但是,交叉編譯器不懂去找這些庫,好吧,好人做到底,
find -name libjpeg.so.62 找出庫,拷貝到gd的安裝目錄下的 lib 文件夾