導航:首頁 > 源碼編譯 > make編譯器設置

make編譯器設置

發布時間:2022-11-07 08:25:32

Ⅰ cmake中修改默認編譯器的兩個問題

在為交叉編譯工程寫cmake腳本時,可以在腳本里修改默認編譯器的值。這種方法會碰到下面兩個問題

例如,下面是一個經過簡化後的CMakeLists.txt:

cmake+make的輸出如下:

可以看到,set(CMAKE_CXX_COMPILER "/usr/bin/g++-4.8")命令之後,默認編譯器已經由g++-5.5修改為了g++-4.8,且編譯階段確實也使用的是g++-4.8。但是此時CMAKE_CXX_COMPILER_VERSION的值仍然是5.5。

例如,頂層CMakeLists.txt中的內容如下:

子目錄sub/CMakeLists.txt中只有一行:

cmake就會陷入死循環:

問題1:

問題2:

但是有個更簡單的方法,可以解決以上所有問題:
在第一個project命令前,修改默認編譯器的定義。
例如:

Ⅱ 如何在makefile中指定編譯器

在具體命令中,指定編譯器即可,如:
all:
<tab>gcc ...
或者
all:
<tab>g++ ...

Ⅲ make怎麼指定編譯器

Make 指定編譯器

g++ -o sdmail_sv
sdmail_sv.o fk_comm_protocol.o fk_content_map.o fk_stat_manager.o fk_sendmail.o
fk_msgqueue.o fk_log.o soapC.o soapClient.o stdsoap2.o -lpthread
/home/zhy/program/gsoap-2.7/gsoap/libgsoap.a
fk_sendmail.o(.text+0xd9): In
function
`FK_SENDMAIL::sendMail(char*)':
/home/zhy/workspace/sendemail/fk_sendmail.cpp:217:
undefined reference to
`soap::soap()'
fk_sendmail.o(.text+0x237):/home/zhy/workspace/sendemail/fk_sendmail.cpp:267:
undefined reference to
`soap::~soap()'
fk_sendmail.o(.text+0x26a):/home/zhy/workspace/sendemail/fk_sendmail.cpp:267:
undefined reference to `soap::~soap()'
fk_sendmail.o(.text+0x49f): In
function `FK_SENDMAIL::sendMail(char const*, char
const*)':
/home/zhy/workspace/sendemail/fk_sendmail.cpp:161: undefined
reference to
`soap::soap()'
fk_sendmail.o(.text+0x5ee):/home/zhy/workspace/sendemail/fk_sendmail.cpp:211:
undefined reference to
`soap::~soap()'
fk_sendmail.o(.text+0x639):/home/zhy/workspace/sendemail/fk_sendmail.cpp:211:
undefined reference to `soap::~soap()'
fk_sendmail.o(.text+0x69f): In
function `FK_SENDMAIL::sendMail(char*,
int)':
/home/zhy/workspace/sendemail/fk_sendmail.cpp:81: undefined reference
to
`soap::soap()'
fk_sendmail.o(.text+0x76b):/home/zhy/workspace/sendemail/fk_sendmail.cpp:149:
undefined reference to
`soap::~soap()'
fk_sendmail.o(.text+0x9a4):/home/zhy/workspace/sendemail/fk_sendmail.cpp:149:
undefined reference to `soap::~soap()'
collect2: ld returned 1 exit
status
make: *** [sdmail_sv] ´íÎó 1
[root@C113563 sendemail]# make
clean
test -z "sdmail_sv" || rm -f sdmail_sv
rm -f *.o
[root@C113563
sendemail]# make

解決思路:
=========
nm libgsoap++.a
nm
libgsoap++.a | grep gsoap

=========
autoreconf -vif
make
clean
./configure --help
./configure CC=g++ CXX=g++
==一句搞定。指定.c文件的編譯也用g++

Ⅳ 大家初學c語言用的編輯器和編譯器是怎麼下載安裝詳細步驟

1.Code::Blocks 是一個開放源碼的全功能的跨平台C/C++集成開發環境.
相比於基於Delphi的Dev-C++共享 C++IDE,Code::Blocks是開放源碼軟體Code::Blocks由純粹的C++語言開發完成,它使用了蓍名的圖形界面庫 wxWidgets(2.6.2unicode)版。對於追求完美的C++程序員,再也不必忍受Eclipse的緩慢,再也不必忍受VS.NET的龐大和高昂的價格。

2.安裝主要步驟

3.運行安裝程序

下載得到一個執行的文件,雙擊後運行,請按照以下說明進行安裝。

選擇「Full/完整」安裝,以免重要插件沒有被安裝上。

安裝目標路徑,不要帶有空格,或者漢字;這一點並不是Code::Blocks的限制,而是因為mingw32里的一些命令行工具,似乎對長目錄或帶空格的目錄支持有點小問題,我估計漢字目錄也會出問題,但沒試過。一句話,就裝在根目錄下的x(AB,C,D):CodeBlocks即可。

4.安裝中文語言包

首先,請在 X:CodeBlocksshareCodeBlocks 建立一個子文件夾:locale,注意 locale 全為小寫字母。簡體漢字的語言包做了較大改進,不過仍然沒改完,另外,一些插件在當前版本本來就無法漢化的,所以還有一部分內容是英語的。

點擊下載d2school版Code::Blocks語言包。

下載後,請解壓到前述的locale目錄下,則locale目錄下,應出現zh_CN和zh_TW兩個子目錄。重新啟動Code::Blocks,點擊主菜單的「Settings」,選擇「Enviornment」。出現的對話框中,左邊選中「View」,右邊打勾「Internationalization (needs restart)」,並在後面的復合框中選中「Chinese (Simplified)」。確認退出本對話框。

5.必要配置

又分為兩步,第一步用於檢查系統環境變數,第二步用於檢查Code::Blocks本身的配置。事實上,這也是很多類似IDE軟體都需要做的准備工作之一。

雖然在多數情況下這兩樣配置在CodeBlocks安裝以後,就已經正確配置上了。但是如果這兩樣配置有誤,會帶來Code::Blocks運行時的很多奇怪的問題,我們還是直接檢查確保一下,同時加以了解。

檢查並配置操作系統環境變數

在桌面上,滑鼠右鍵點擊「我的電腦」,選擇彈出菜單中的「屬性」。在屬性對話框中,選中「高級」屬性頁。點擊其下「環境變數」按鈕,將新彈出一個對話框,如下圖,選中「系統變數」下的「PATH」一行。然後點擊其下「編輯」按鈕,再次彈出一個對話框。

全選,並復制(Ctrl + C)第二行的內容。然後打開寫字板程序,檢查以下內容是否出現在復制過來的文字中:

X:CodeBlocksMinGWin; X:.4.5;

其中「X:CodeBlocks」應為您本機安裝Code::Blocks時的路徑。

如果沒有,將所缺少的部分,錄入到配置內容,所插入位置最好微靠前一點,注意包括其中的分號。

修改完之後,別忘了復制修改後的全部內容,粘貼,替換一路「確定」,關掉各級對話框。

6.Code::Blocks全局編譯器設置

請大家首先到 X:CodeBlocksMinGWin下,搜索,檢查有沒有存在以下文件:

Ⅳ 如何在cmake3.7.2中將ndk-toolchain的編譯器設置為gcc和g++

不過,我個人覺得直接指定編譯器就可以了。通過修改兩個變數c_compiler和cxx_compiler就可以了 .具體的話網路吧。

linux下怎樣給編譯器設置編譯的參數

編譯器的參數都是編譯的時候執行命令帶的。
一般會寫在Makefile里,直接敲make
在makefile裡面 gcc -l -I -L 等等都是這樣加參數的。
推薦你看一本書《linux就該這么學》書中內容非常豐富,LINUX基本問題都可以在書中解決。望採納!

Ⅶ linux 下的make編譯環境設置

最好都安裝 一個是開發工具 一個是開發庫

Ⅷ Linux平台Makefile文件的編寫基礎篇

目的:
基本掌握了 make 的用法,能在Linux系統上編程
環境:
Linux系統,或者有一台Linux伺服器,通過終端連接。一句話:有Linux編譯環境。
准備:
准備三個文件:file1.c, file2.c, file2.h
file1.c:
#include
#include "file2.h"
int main()
{
printf("print file1$$$$$$$$$$$$ ");
File2Print();
return 0;
}

file2.h:

#ifndef FILE2_H_
#define FILE2_H_

#ifdef __cplusplus

extern "C" {

#endif

void File2Print();

#ifdef __cplusplus

}

#endif

#endif


file2.c:
#include "file2.h"
void File2Print()
{
printf("Print file2********************** ");
}

基礎:
先來個例子:
有這么個Makefile文件。(文件和Makefile在同一目錄)
=== makefile 開始 ===
helloworld:file1.o file2.o
gcc file1.o file2.o -o helloworld

file1.o:file1.c file2.h
gcc -c file1.c -o file1.o

file2.o:file2.c file2.h

gcc -c file2.c -o file2.o


clean:

rm -rf *.o helloworld

=== makefile 結束 ===

一個 makefile 主要含有一系列的規則,如下:
A: B
(tab)
(tab)

每個命令行前都必須有tab符號。


上面的makefile文件目的就是要編譯一個helloworld的可執行文件。讓我們一句一句來解釋:

helloworld : file1.o file2.o: helloworld依賴file1.o file2.o兩個目標文件。

gcc File1.o File2.o -o helloworld: 編譯出helloworld可執行文件。-o表示你指定 的目標文件名。


file1.o : file1.c: file1.o依賴file1.c文件。

gcc -c file1.c -o file1.o: 編譯出file1.o文件。-c表示gcc 只把給它的文件編譯成目標文件, 用源碼文件的文件名命名但把其後綴由「.c」或「.cc」變成「.o」。在這句中,可以省略-o file1.o,編譯器默認生成file1.o文件,這就是-c的作用。


file2.o : file2.c file2.h
gcc -c file2.c -o file2.o

這兩句和上兩句相同。


clean:

rm -rf *.o helloworld

當用戶鍵入make clean命令時,會刪除*.o 和helloworld文件。


如果要編譯cpp文件,只要把gcc改成g++就行了。

寫好Makefile文件,在命令行中直接鍵入make命令,就會執行Makefile中的內容了。


到這步我想你能編一個Helloworld程序了。


上一層樓:使用變數

上面提到一句,如果要編譯cpp文件,只要把gcc改成g++就行了。但如果Makefile中有很多gcc,那不就很麻煩了。

第二個例子:

=== makefile 開始 ===
OBJS = file1.o file2.o
CC = gcc
CFLAGS = -Wall -O -g

helloworld : $(OBJS)
$(CC) $(OBJS) -o helloworld

file1.o : file1.c file2.h
$(CC) $(CFLAGS) -c file1.c -o file1.o

file2.o : file2.c file2.h
$(CC) $(CFLAGS) -c file2.c -o file2.o


clean:

rm -rf *.o helloworld
=== makefile 結束 ===


這里我們應用到了變數。要設定一個變數,你只要在一行的開始寫下這個變數的名字,後 面跟一個 = 號,後面跟你要設定的這個變數的值。以後你要引用 這個變數,寫一個 $ 符號,後面是圍在括弧里的變數名。


CFLAGS = -Wall -O –g,解釋一下。這是配置編譯器設置,並把它賦值給CFFLAGS變數。

-Wall: 輸出所有的警告信息。

-O: 在編譯時進行優化。

-g: 表示編譯debug版本。


這樣寫的Makefile文件比較簡單,但很容易就會發現缺點,那就是要列出所有的c文件。如果你添加一個c文件,那就需要修改Makefile文件,這在項目開發中還是比較麻煩的。



再上一層樓:使用函數

學到這里,你也許會說,這就好像編程序嗎?有變數,也有函數。其實這就是編程序,只不過用的語言不同而已。

第三個例子:

=== makefile 開始 ===
CC = gcc

XX = g++
CFLAGS = -Wall -O –g

TARGET = ./helloworld

%.o: %.c

$(CC) $(CFLAGS) -c lt; -o [email protected]

%.o:%.cpp

$(XX) $(CFLAGS) -c lt; -o [email protected]


SOURCES = $(wildcard *.c *.cpp)
OBJS = $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCES)))


$(TARGET) : $(OBJS)
$(XX) $(OBJS) -o $(TARGET)

chmod a+x $(TARGET)

clean:

rm -rf *.o helloworld
=== makefile 結束 ===

函數1:wildcard

產生一個所有以 '.c' 結尾的文件的列表。

SOURCES = $(wildcard *.c *.cpp)表示產生一個所有以 .c,.cpp結尾的文件的列表,然後存入變數 SOURCES 里。


函數2:patsubst

匹配替換,有三個參數。第一個是一個需要匹配的式樣,第二個表示用什麼來替換它,第三個是一個需要被處理的由空格分隔的列表。

OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字元變成.o,形成一個新的文件列表,然後存入OBJS變數中。


%.o: %.c

$(CC) $(CFLAGS) -c lt; -o [email protected]

%.o:%.cpp

$(XX) $(CFLAGS) -c lt; -o [email protected]

這幾句命令表示把所有的.c,.cpp編譯成.o文件。

這里有三個比較有用的內部變數。 [email protected] 擴展成當前規則的目的文件名, lt; 擴展成依靠 列表中的第一個依靠文件,而 $^ 擴展成整個依靠的列表(除掉了裡面所有重 復的文件名)。


chmod a+x $(TARGET)表示把helloworld強制變成可執行文件。

Ⅸ 如何使用CMake進行交叉編譯

cmake交叉編譯配置

很多時候,我們在開發的時候是面對嵌入式平台,因此由於資源的限制需要用到相關的交叉編譯。即在你host宿主機上要生成target目標機的程序。裡面牽扯到相關頭文件的切換和編譯器的選擇以及環境變數的改變等,我今天僅僅簡單介紹下相關CMake在面對交叉編譯的時候,需要做的一些准備工作。

CMake給交叉編譯預留了一個很好的變數CMAKE_TOOLCHAIN_FILE,它定義了一個文件的路徑,這個文件即toolChain,裡面set了一系列你需要改變的變數和屬性,包括C_COMPILER,CXX_COMPILER,如果用Qt的話需要更改QT_QMAKE_EXECUTABLE以及如果用BOOST的話需要更改的BOOST_ROOT(具體查看相關Findxxx.cmake裡面指定的路徑)。CMake為了不讓用戶每次交叉編譯都要重新輸入這些命令,因此它帶來toolChain機制,簡而言之就是一個cmake腳本,內嵌了你需要改變以及需要set的所有交叉環境的設置。

toolChain腳本中設置的幾個重要變數

1.CMAKE_SYSTEM_NAME:

即你目標機target所在的操作系統名稱,比如ARM或者Linux你就需要寫"Linux",如果Windows平台你就寫"Windows",如果你的嵌入式平台沒有相關OS你即需要寫成"Generic",只有當CMAKE_SYSTEM_NAME這個變數被設置了,CMake才認為此時正在交叉編譯,它會額外設置一個變數CMAKE_CROSSCOMPILING為TRUE.

2. CMAKE_C_COMPILER:

顧名思義,即C語言編譯器,這里可以將變數設置成完整路徑或者文件名,設置成完整路徑有一個好處就是CMake會去這個路徑下去尋找編譯相關的其他工具比如linker,binutils等,如果你寫的文件名帶有arm-elf等等前綴,CMake會識別到並且去尋找相關的交叉編譯器。

3. CMAKE_CXX_COMPILER:

同上,此時代表的是C++編譯器。

4. CMAKE_FIND_ROOT_PATH:

指定了一個或者多個優先於其他搜索路徑的搜索路徑。比如你設置了/opt/arm/,所有的Find_xxx.cmake都會優先根據這個路徑下的/usr/lib,/lib等進行查找,然後才會去你自己的/usr/lib和/lib進行查找,如果你有一些庫是不被包含在/opt/arm裡面的,你也可以顯示指定多個值給CMAKE_FIND_ROOT_PATH,比如

set(CMAKE_FIND_ROOT_PATH /opt/arm /opt/inst)

該變數能夠有效地重新定位在給定位置下進行搜索的根路徑。該變數默認為空。當使用交叉編譯時,該變數十分有用:用該變數指向目標環境的根目錄,然後CMake將會在那裡查找。

5. CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:

對FIND_PROGRAM()起作用,有三種取值,NEVER,ONLY,BOTH,第一個表示不在你CMAKE_FIND_ROOT_PATH下進行查找,第二個表示只在這個路徑下查找,第三個表示先查找這個路徑,再查找全局路徑,對於這個變數來說,一般都是調用宿主機的程序,所以一般都設置成NEVER

6. CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:

對FIND_LIBRARY()起作用,表示在鏈接的時候的庫的相關選項,因此這里需要設置成ONLY來保證我們的庫是在交叉環境中找的.

7. CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:

對FIND_PATH()和FIND_FILE()起作用,一般來說也是ONLY,如果你想改變,一般也是在相關的FIND命令中增加option來改變局部設置,有NO_CMAKE_FIND_ROOT_PATH,ONLY_CMAKE_FIND_ROOT_PATH,BOTH_CMAKE_FIND_ROOT_PATH

8. BOOST_ROOT:

對於需要boost庫的用戶來說,相關的boost庫路徑配置也需要設置,因此這里的路徑即ARM下的boost路徑,裡面有include和lib。

9. QT_QMAKE_EXECUTABLE:

對於Qt用戶來說,需要更改相關的qmake命令切換成嵌入式版本,因此這里需要指定成相應的qmake路徑(指定到qmake本身)

toolChain demo

# this is required
SET(CMAKE_SYSTEM_NAME Linux)

# specify the cross compiler
SET(CMAKE_C_COMPILER /opt/arm/usr/bin/ppc_74xx-gcc)
SET(CMAKE_CXX_COMPILER /opt/arm/usr/bin/ppc_74xx-g++)

# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/arm/ppc_74xx /home/rickk/arm_inst)

# search for programs in the build host directories (not necessary)
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# configure Boost and Qt
SET(QT_QMAKE_EXECUTABLE /opt/qt-embedded/qmake)
SET(BOOST_ROOT /opt/boost_arm)

這樣就完成了相關toolChain的編寫,之後,你可以靈活的選擇到底採用宿主機版本還是開發機版本,之間的區別僅僅是一條-DCMAKE_TOOLCHAIN_FILE=./toolChain.cmake,更爽的是,如果你有很多程序需要做轉移,但目標平台是同一個,你僅僅需要寫一份toolChain放在一個地方,就可以給所有工程使用。

閱讀全文

與make編譯器設置相關的資料

熱點內容
iis7gzip壓縮 瀏覽:39
有什麼安卓機打吃雞好 瀏覽:595
三星u盤加密狗 瀏覽:471
php函數的返回值嗎 瀏覽:584
國企穩定程序員 瀏覽:325
編程貓如何使用教程視頻 瀏覽:216
安卓遠端網頁如何打日誌 瀏覽:216
壓縮flash大小 瀏覽:991
解壓的玩具教程可愛版 瀏覽:366
哪個求職app比較靠譜 瀏覽:888
java的讀法 瀏覽:59
nod32區域網伺服器地址 瀏覽:1002
數碼科技解壓 瀏覽:235
新網的雲伺服器管理界面復雜嗎 瀏覽:367
無人聲解壓強迫症視頻 瀏覽:571
計算機編譯運行 瀏覽:639
單片機嵌套 瀏覽:988
python字元串中符號 瀏覽:787
python正則表達式貪婪模式 瀏覽:650
愛國精神指的是什麼app 瀏覽:408