stdio.h ???
基本輸入輸出庫的頭文件???
大哥,你是不是除了 gcc ,別的都沒裝?
這個文件應該是 glibc 的開發部分自帶的頭文件。
遇到這個問題你可能:
1、gcc 有問題,沒有設置或者放錯了默認 C header搜索路徑。
2、header 放錯了位置,和 gcc 的設置不匹配。
3、你根本就沒裝。
㈡ LINUX交叉編譯工具鏈和GCC是什麼關系啊
編譯工具鏈一般最簡化的為
binutils
+
gcc
+
glibc
+
kernel-header
組合的環境。
GCC
就是編譯器,他的輸出每次安裝只能有針對一個架構的指令輸出。如果要多個架構輸出,那就要裝多個
GCC
,所以編譯工具鏈裡面會有一個
GCC
。
交叉編譯就是跨架構編譯,編譯出來的程序不能在本機執行(當然有例外情況)。所以這個時候就需要交叉編譯工具鏈。
工具鏈光有
GCC
是不行的,還需要一個
binutils
的二進制連接器,以及一個最基本的目標架構的
C
庫,C
庫還需要一個目標架構的內核源代碼才能完全工作(當然不是必須的,但編譯有的時候需要)
又因為
GCC
、binutils
不能實現單軟體同時多架構輸出,所以需要單獨另裝,又加上
C
庫和內核頭文件需要目標架構的東西而不能用本機本地架構的數據。
所以一個交叉編譯工具鏈就是針對目標架構准備的單獨安裝單獨使用的
binutils
+
gcc
+
glibc
+
kernel-header
的集合了。
PS:這個
kernel-header
並不一定就是
Linux
,他還可以是別的系統核心開發庫,比如
FreeBSD
。
㈢ arm-linux-gnueabihf交叉編譯工具鏈使用問題
與使用gcc或g++方法一樣,只是把命令替換成arm-linux-gnueabihf-gcc或arm-linux-gnueabihf-g++
例如
arm-linux-gnueabihf-gcc -g -o helloworld main.c
寫Makefile文件時也要注意命令的替換,舉例
CC=arm-linux-gnueabihf-gcc
helloworld : main.c
$(CC) -g -o helloworld main.c
㈣ arm-linux-gcc工具鏈:匯編文件如何include c的頭文件呢
按照樓上的帖子試了一下不行我是這樣寫的:a.h:#define
a
1a.S:.include
"a.h"mov
r0,#a然後用arm-linux-gcc
a.S
進行編譯,報錯:a.S:
Assembler
messages.S:3:
Error:
undefined
symbol
a
used
as
an
immediate
value問題出在哪裡呢???
查看原帖>>
㈤ 如何制定android交叉編譯工具鏈
經常搞嵌入式開發的朋友對於交叉編譯環境應該並不陌生,說白了,就是一組運行在x86 PC機的編譯工具,可以讓你在PC機上編譯出目標平台(例如ARM)可識別的二進制文件。Android平台也提供了這樣的交叉編譯工具鏈,就放在Android的NDK開發包的toolchains目錄下,因此,我們的Makefile文件中,只需給出相應的編譯工具即可。
廢話就先說到這,直接上例子,我們目標是把下面這個math.c文件編譯成一個靜態庫文件:
#include <stdio.h>
int add( int a , int b ) {
return a+b;
}
你需要編寫一個Makefile文件,這里假設你的Android ndk被安裝在 /opt/android/ndk 目錄下,當然,你可以根據自己的實際情況修改Makefile中相關路徑的定義,Makefile文件示例如下:
# Makefile Written by ticktick
# Show how to cross-compile c/c++ code for android platform
.PHONY: clean
NDKROOT=/opt/android/ndk
PLATFORM=$(NDKROOT)/platforms/android-14/arch-arm
CROSS_COMPILE=$(NDKROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
LD=$(CROSS_COMPILE)ld
CFLAGS = -I$(PWD) -I$(PLATFORM)/usr/include -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp
LDFLAGS =
TARGET = libmath.a
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
all: $(OBJS)
$(AR) -rc $(TARGET) $(OBJS)
clean:
rm -f *.o *.a *.so
這里不講Makefile文件的基本原理,只說明一下針對Android環境的Makefile文件編寫的注意事項。
(1) CROSS_COMPILE
必須正確給出Android NDK編譯工具鏈的路徑,當在目錄中執行make命令的時候,編譯系統會根據 CROSS_COMPILE 前綴尋找對應的編譯命令。
(2) -I$(PLATFORM)/usr/include
由於Android平台沒有使用傳統的c語言庫libc,而是自己編寫了一套更加高效更適合嵌入式平台的c語言庫,所以系統頭文件目錄不能再使用默認的路徑,必須直到Android平台的頭文件目錄
(3) -Wall -O2 -fPIC -DANDROID -DHAVE_PTHREAD -mfpu=neon -mfloat-abi=softfp
這些參數的意義網上基本上都有介紹,我就不一一解釋了,並不都是必須添加的,但比較常用。
編譯方法:
寫好makefile文件,並且保存之後,就可以直接在當前目錄下執行make命令,編譯完成後,當前目錄下會生成 libmath.a ,即可直接拿到Android的jni工程中和使用了。
㈥ C/C++源文件直接交叉編譯生成.so文件供安卓應用程序調用,可以嗎
Jni調用就行了,是要按規則寫介面api,如果介面很多,也沒法,那是你的業務問題,要重新設計業務邏輯。我們之前用的c++單獨交叉編譯一個進程,和安卓界面用tcp通信,如果介面多也以為著協議多,一樣的。
㈦ arm-linux-gcc 交叉工具鏈可以直接在linux上編譯生成STM32(Cotex-M3內核)的程序嗎跪求高手現身。
看你的編譯器,但是 M3 這個內核比較新,在舊版本的 gcc 上會沒有針對這個 CPU 的支持。
M3 好像有部分指令不支持,如果你的編譯器不支持,編譯出來的程序會不能正常運行。
這東西不是隨便找個幾百年前的東西,就能支持新硬體的。
你看看你的 gcc 到底支持什麼 CPU 吧……
gcc-4.8.1 反正支持如下 arm CPU 和核心。
-mcpu=name
This specifies the name of the target ARM processor. GCC uses this name to determine what kind of instructions it can emit when generating assembly code. Permissible names are: 『arm2』, 『arm250』, 『arm3』, 『arm6』, 『arm60』, 『arm600』, 『arm610』, 『arm620』, 『arm7』, 『arm7m』, 『arm7d』, 『arm7dm』, 『arm7di』, 『arm7dmi』, 『arm70』, 『arm700』, 『arm700i』, 『arm710』, 『arm710c』, 『arm7100』, 『arm720』, 『arm7500』, 『arm7500fe』, 『arm7tdmi』, 『arm7tdmi-s』, 『arm710t』, 『arm720t』, 『arm740t』, 『strongarm』, 『strongarm110』, 『strongarm1100』, 『strongarm1110』, 『arm8』, 『arm810』, 『arm9』, 『arm9e』, 『arm920』, 『arm920t』, 『arm922t』, 『arm946e-s』, 『arm966e-s』, 『arm968e-s』, 『arm926ej-s』, 『arm940t』, 『arm9tdmi』, 『arm10tdmi』, 『arm1020t』, 『arm1026ej-s』, 『arm10e』, 『arm1020e』, 『arm1022e』, 『arm1136j-s』, 『arm1136jf-s』, 『mpcore』, 『mpcorenovfp』, 『arm1156t2-s』, 『arm1156t2f-s』, 『arm1176jz-s』, 『arm1176jzf-s』, 『cortex-a5』, 『cortex-a7』, 『cortex-a8』, 『cortex-a9』, 『cortex-a15』, 『cortex-r4』, 『cortex-r4f』, 『cortex-r5』, 『cortex-m4』, 『cortex-m3』, 『cortex-m1』, 『cortex-m0』, 『cortex-m0plus』, 『marvell-pj4』, 『xscale』, 『iwmmxt』, 『iwmmxt2』, 『ep9312』, 『fa526』, 『fa626』, 『fa606te』, 『fa626te』, 『fmp626』, 『fa726te』.
-mcpu=generic-arch is also permissible, and is equivalent to -march=arch -mtune=generic-arch. See -mtune for more information.
-mcpu=native causes the compiler to auto-detect the CPU of the build computer. At present, this feature is only supported on Linux, and not all architectures are recognized. If the auto-detect is unsuccessful the option has no effect.
㈧ 標准C程序如何移植到android平台需要什麼編譯參數,我用的是arm-eabi-gcc工具鏈
首先 你編譯的程序 用cat命令看 目錄應該是/lib/libc.so.6 而Android 是 /system/lib/libc.so
本來已經有C庫了 但是 我這里沒有用~ 你可以在 你的PC安裝機子上找到 交叉編譯arm-eabi-gcc或 arm-linux-gcc安裝目錄下的arm/4.3.2/..../libc/lib/libc2.8.so好像 是這個 有一個是libc.so.6 這個是一個連接 不是文件 查看屬性 看下連接的文件應該是 那個libc2.8.so (放心它是arm版的)拷貝這個文件到 安卓/system/lib/去 然後
用RE文件 為它添加一個 連接 /system/lib/libc.so.6 就可以了
這樣 標准庫是被移植去了 但是 你的應用程序 有可能使用的是 /lib/libc.so.6 不是 /system/lib/libc.so.6
先測試不行的話 就把 /system/lib 連接為/lib