當前位置:首頁 » 編程軟體 » 交叉編譯時傳入宏參數

交叉編譯時傳入宏參數

發布時間: 2022-04-11 10:15:42

㈠ 能在linux下,使用#pragma來定義宏嗎

對於位元組對齊的設置, 好像沒有一個標准, 各個編譯器都有自己的方法, #pragma pack(1) 應該是 VC 上的吧! 至於 arm-linux-gcc 沒用過, 不過用過非 arm 的嵌入式 gcc, 有一個命令行選項, 好像是 -fpack-struct, 可以以緊湊方式生成結構數據. 你搜索一下這個選項, 應該有很多說明的.

PS: 在一些嵌入式的CPU下, 會有一種對齊異常, 你在使用這個選擇的時候應該注意一下.

㈡ 請問C語言中帶參數的宏和函數的比較

宏是用於編譯器處理的,他在程序編譯時,會在對應位置展開成代碼。。,這就相當於你在告訴編譯器,我想在這個位置加一些代碼,代碼的內容已在宏中定義,請編譯器自己支找。。。,也就是說程序在運行時,早已變成了對應位置上的代碼,此時已沒有宏的概念了。。。。
而函數則是運行時,調用。他不會在編譯時,在對應位置上加上函數代碼,只是加上一個函數入口指針。。。從這個入口去運行一段代碼。。。運行完了之後回到當前位置繼續執行。。。。
可以簡單的認為,宏是在編譯時上起作用,而函數是運行時起作用。。。

㈢ 編譯器有沒有宏定義32位和64位

請問是什麼語言的編譯器?
如果是C,應該無法宏定義。C關於具體平台的實現很多依賴於具體系統的std庫,而編譯器的位數也是在安裝時就決定的,無法動態修改
但可以交叉編譯,具體過程有點復雜,這里就不提了

㈣ C語言中的宏定義如何傳遞形參

給宏傳遞運行時計算的變數是絕無可能辦到的。


不過假如只是這一個循環的話,可以利用預處理展開……

#defineREPEAT_0(f)f(0)
#defineREPEAT_1(f)REPEAT_0(f)f(1)
#defineREPEAT_2(f)REPEAT_1(f)f(2)
#defineREPEAT_3(f)REPEAT_2(f)f(3)
#defineREPEAT_4(f)REPEAT_3(f)f(4)
#defineREPEAT_5(f)REPEAT_4(f)f(5)
#defineREPEAT_6(f)REPEAT_5(f)f(6)
#defineREPEAT_7(f)REPEAT_6(f)f(7)
#defineREPEAT_8(f)ERROR_EXCEED_LIMIT

#defineREPEAT(n,f)REPEAT_##n(f)
/*用法如下*/
#defineLD(n)LEFT_BACK(n);Delay(4);
REPEAT(7,LD)

好處是這個宏是可以重用的,在別的地方也可以使用,並且不佔運行時間。

㈤ 急(C語言)比較帶參的宏與帶參的函數之間的區別

區別:
1、宏會在編譯器在對源代碼進行編譯的時候進行簡單替換,不會進行任何邏輯檢測,即簡單代碼復制而已。
2、宏進行定義時不會考慮參數的類型。
3、參數宏的使用會使具有同一作用的代碼塊在目標文件中存在多個副本,即會增長目標文件的大小。
4、參數宏的運行速度會比函數快,因為不需要參數壓棧/出棧操作。
5、參數宏在定義時要多加小心,多加括弧。
6、函數只在目標文件中存在一處,比較節省程序空間。
7、函數的調用會牽扯到參數的傳遞,壓棧/出棧操作,速度相對較慢。
8、函數的參數存在傳值和傳地址(指針)的問題,參數宏不存在。

㈥ C語言 有參數宏定義

宏屬於預編譯,在編譯的時候就將你的
SSSV(sa,sb,sc,vv);
替換成
sa=l*w;sb=l*h;sc=w*h;vv=w*l*h;
這些編譯器已經給你處理了,宏這個就是直接替換
宏有編寫規范的,你這里寫的宏並不規范,建議上網查一下宏書寫的規范

㈦ C語言函數問題。帶參數的宏ab這里是實參,下面mn也是實參,所以這里是下面的實參傳給上面的實參嗎

普通函數的聲明,定義里用的叫形參,普通函數調用時,調用語句里的參數叫實參。
宏與它們不一樣,宏在預編譯期間,做的工作 是 替代 (字元替代,名字替代)。
#defind area(a,b) (PI * a * b) 裡面的 PI 要被 前面PI 的 宏定義 替代成:
#defind area(a,b) ((asin(1) * 2) * a * b)
然後程序里的 s = area(m,n); 要用 area(a,b) 的 宏 替代,同時要把 實際參數 m,n代入,變成:
s = ((asin(1) * 2) * m * n);
上述工作完成後,編譯器,再把 這個替代工作完成後的 源程序, 編譯和鏈接成 可執行程序 .exe 文件。

㈧ C/C++宏定義可不可以傳入參數

#define P(a,b,c,d,e,f,g.........)參數可以隨便設,宏定義其實是一個預處理替換,只是你要將對應的參數執行正確的操作。在C++中宏定義一系列簡單操作的話可以用inline函數來替換,編譯器對inline函數的處理是把接受了參數的inline函數的函數體和目標代碼進行替換,有點像宏但比宏安全。

例如:#define P(x,y) int array[x]; cout << array[y];

在main中書寫P(3,2)則編譯器便把P(3,2)替換為 int array[3]; cout << array[2];

也可以使用inline函數如:
inline void func(const int& x,const int& y){
int array[x];
cout << array[y];
}
但有時候使用宏定義卻很危險如:
#define P(x,y) (x) > (y) ? (x):(y)
int a = 3;
int b;
對於這樣的語句b = P(++a,3)最後b卻等於5,這並不是你想要的結果,這個時候使用inline函數就可以解決宏定義的不安全問題如:
template<class T>
inline const T& func(const T& x,const T& y){
return x > y ? x : y;
}
這樣b = (++a,3)最後的結果便是4。

㈨ 如何在configure時,將編譯參數傳入,改變默認的編譯器gcc成arm

你是要交叉編譯吧,這個不是改參數就能做到的,而是需要另外的交叉編譯工具。是想在Linux下編譯出能在手機上運行的二進制文件么,網路吧,不是三言兩語能講明白的。

㈩ Qt交叉編譯遇到的問題

QT相關的安裝軟體包:

(1) tmake-1.13.tar.gz (編譯工具,如progen與tmake)

(2) qt-embedded-2.3.7.tar.gz (提供了qte的庫)

(3) qt-x11-2.3.2.tar.gz (為了生成相應的QT工具,如designer和qvfb等)

(4) qtopia-free-1.7.0.tar.gz (QTE的桌面環境程序)

(5) cross-3.3.2.tar.bz2 (交叉編譯工具)

一、安裝工具

1 安裝 tmake

在 Linux 命令模式下運行以下命令:

tar xfz tmake-1.11.tar.gz

export TMAKEDIR=$PWD/tmake-1.11

export TMAKEPATH=$TMAKEDIR/lib/qws/linux-x86-g++

export PATH=$TMAKEDIR/bin:$PATH

2 安裝 Qt/Embedded 2.3.7

在 Linux 命令模式下運行以下命令:

tar xfz qt-embedded-2.3.7.tar.gz

cd qt-2.3.7

export QTDIR=$PWD

export QTEDIR=$QTDIR

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

./configure –qconfig local–qvfb -depths 4,8,16,32

make sub-src

cd ..

上述命令 ./configure -qconfig -qvfb -depths 4,8,16,32 指定 Qt 嵌入式開發包生成虛擬緩沖幀工具qvfb,並支持 4,8,16,32 位的顯示顏色深度。另外我們也可以在 configure 的參數中添加-system-jpeg 和 gif,使 Qt/Embedded 平台能支持 jpeg、gif 格式的圖形。

上述命令 make sub-src 指定按精簡方式編譯開發包,也就是說有些 Qt 類未被編譯。Qt 嵌入式開發包有 5種編譯范圍的選項,使用這些選項,可控制 Qt 生成的庫文件的大小,但是您的應用所使用到的一些 Qt 類將可能因此在 Qt 的庫中找不到鏈接。編譯選項的具體用法可運行./configure -help 命令查看。

在這一過程的configure中出現了問題:有一個變數沒有聲明,發現是少了一個頭文件,加上即可,make順利通過,看到了enjoy!

3 安裝 Qt/X11 2.3.2

在 Linux 命令模式下運行以下命令:

tar xfz qt-x11-2.3.2.tar.gz

cd qt-2.3.2

export QTDIR=$PWD

export PATH=$QTDIR/bin:$PATH

export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

./configure -no-opengl

make

make -C tools/qvfb

mv tools/qvfb/qvfb bin

cp bin/uic $QTEDIR/bin

cd ..

根據開發者本身的開發環境,也可以在 configure 的參數中添加別的參數, 比如-no-opengl 或-no-xfs,可以鍵入./configure -help 來獲得一些幫助信息。

在這個安裝過程中也出現了很多錯誤,典型的就是在make過程中:

/usr/local/qt-2.3.2/include/qvaluestack.h:57: error: cannot convert 'QValueListIterator<QMap<QString, QString> >' to 'const char*' for argument '1' to 'int remove(const char*)'

/usr/local/qt-2.3.2/include/qvaluestack.h: In member function 'T QValueStack<T>::pop() [with T = QString]':

xml/qxml.cpp:2502: instantiated from here

/usr/local/qt-2.3.2/include/qvaluestack.h:57: error: cannot convert 'QValueListIterator<QString>' to 'const char*' for argument '1' to 'int remove(const char*)'

make[2]: *** [xml/qxml.o] Error 1

make[2]: Leaving directory `/usr/local/qt-2.3.2/src'

make[1]: *** [sub-src] Error 2

make[1]: Leaving directory `/usr/local/qt-2.3.2'

make: *** [init] Error 2

這個錯誤是說,在文件qvaluestack.h的57行出錯。改正方法是修改文件qt-2.3.2/ include/qvaluestack.h的 第57行,將remove( this->fromLast() );改為 this->remove( this->fromLast() );

修改時可能要更改文件許可權,變成可寫的,chmod 666 qvaluestack.h。然後make順利通過,看到了enjoy。

二、交叉編譯 Qt/Embedded 的庫

開發居於 Qt/Embedded 的應用程序要使用到 Qt/Embedded 的庫,編寫的 Qt 嵌入式應用程序最終是在YLE270開發板上運行的,因此在把 Qt 嵌入式應用程序編譯成支持 YLE270 的目標代碼之前,需要兩樣東西,一個是 arm9 的 linux 編譯器,另一個是經 arm9 的linux 編譯器編譯過的 Qt/Embedded 的庫。安裝交叉編譯工具 cross-3.3.2 前面已經安裝過了。

這一步主要是配置 Qt/Embedded2.3.7 的安裝,Qt/Embedded 的安裝選項有很多個,您可以在命令行下直接輸入「./configure」來運行配置,這時安裝程序會一步一步提示你輸入安裝選項。您也可以在「./configure」後輸入多個安裝選項直接完成安裝的配置。在這些選項中有一個選項決定了編譯 Qt/Embedded 庫的范圍,即可以指定以最小,小,中,大,完全 5 種方式編譯 Qt/Embedded 庫。另外 Qt/Embedded 的安裝選項還允許我們自己定製一個配置文件,來有選擇的編譯 Qt/Embedded 庫,這個安裝選項是「-qconfig local」 ;當我們指定這個選項時,Qt/Embedded庫在安裝過程中會尋找qt-2.3.7/src/tools/qconfig-local.h 這個文件,如找到這個文件,就會以該文件裡面定義的宏,來編譯鏈接 Qt/Embedded 庫。

具體過程如下:

cd qt-2.3.7

export QTDIR=$PWD

export QTEDIR=$QTDIR

make clean

./configure –xplatform linux-arm-g++ -shared –debug (接下行)

-qconfig local -qvfb -depths 4,8,16,32

make

cd ..

在make中出現了錯誤,有變數沒有聲明,原來是優龍公司為了避免初學者在一開始就直接接觸到 Qt/Embedde 的復雜的宏編譯選項,把這些宏定義到一個名為 qconfig-local.h的安裝配置文件中,在安裝 Qt/Embedded 的時候,需要把這個文件復制到 Qt/Embedded 的安裝路徑的/src/tools 子路徑下,

cp /配置文件所在路徑/qconfig-local.h ./src/tools

make順利通過,看到了enjoy。

最後就可以在命令行下輸入make 命令對整個工程進行編譯鏈接了,在這里,要把過程中產生的文件放在同一個文件夾裡面,方便應用。

在最後make完畢以後我還是遇到了一個問題,就是生成的可執行文件不能運行,運行時提示:./hello cannot execute binary file,當然不能直接在自己的主機上運行了,因為生成的二進制文件要下到板子上運行的。接上液晶屏,板子上電,把生成的可執行文件下載到板子上,要chmod一下,不然許可權不夠,終於在液晶屏上看到了自己弄的小程序,好開心!

三、添加一個 Qt/Embedded 應用到 QPE

以hello,world!為例

1 在工作的機器上解包 qtopia

tar zxvf qtopia-free-1.7.x.tar.gz

cd qtopia-free-1.7.x

export QTDIR=$QTEDIR

export QPEDIR=$PWD

export PATH=$QPEDIR/bin:$PATH

注意在上面已經設定環境變數 QPEDIR 為 QPE 的安裝(解包)路徑。

2 建立 Hello,World 的例子程序的圖標文件

方法是:製作一個 32 X 32 大小的 PNG 格式的圖標文件,將該文件存放在$QPEDIR/pics/inline 目錄下,然後使用以下命令將$QPEDIR/pics/inline 目錄下的所有圖形文件轉換成為一個 c 語言的頭文件,這個頭文件包含了該目錄下的圖形文件的 rgb 信息。

qembed --images $QPEDIR/pics/inline/*.*

> $QPEDIR/src/libraries/qtopia/inlinepics_p.h

3 交叉編譯 qtopia

在$QPEDIR 路徑下,運行以下命令

cd src

./configure –platform linux-arm-g++

make

cd ..

在這一過程中也出現了比較大的錯誤,在make的時候又出現了error,是resource.cpp的174行的變數qembed_findImage沒有聲明,考慮到以前遇到的情況,推斷可能是少了某個頭文件,但是又不知道是哪一個,google了很久都沒有找到解決辦法,沒辦法只好點開src/libraries/qtopia下面的每一個頭文件看了一遍,還是沒有發現有含有這個變數的文件,繼續google,然後發現了inlinepics_p.h中包含qembed_findImage,於是vi /usr/local/qtopia-free-1.7.0/src/libraries/qtopia/inlinepics_p.h,發現inlinepics_p.h是空白的,原來是

qembed --images $QPEDIR/pics/inline/*.*

> $QPEDIR/src/libraries/qtopia/inlinepics_p.h

出了錯誤,重新操作一遍這一步,再查看inlinepics_p.h,發現正常了,要繼續交叉編譯qtopia:

make clean

./configure –platform linux-arm-g++

熱點內容
魅族手機怎麼找回密碼 發布:2025-03-14 02:35:48 瀏覽:296
配置高低主要看什麼 發布:2025-03-14 01:49:22 瀏覽:85
locpython 發布:2025-03-14 01:12:50 瀏覽:342
java數組的定義方法 發布:2025-03-14 00:53:25 瀏覽:517
壓縮性綳帶 發布:2025-03-14 00:30:21 瀏覽:185
如何給樹莓派編譯適合的軟體 發布:2025-03-14 00:29:45 瀏覽:377
c語言編譯器雲盤鏈接 發布:2025-03-14 00:25:23 瀏覽:350
電腦上哪個游戲可以移植到安卓上 發布:2025-03-14 00:10:32 瀏覽:474
tcl編譯器 發布:2025-03-13 23:52:59 瀏覽:325
linuxnamed 發布:2025-03-13 23:45:29 瀏覽:365