『壹』 ubuntu cmake怎麼指定編譯器
可以使用cmake --version 查看 如果輸出 cmake的版本號說明已經正確安裝了cmake 如果提示沒有cmake這個命令,說明沒有正確安裝 下面給出安裝cmake的步驟 可以直接在線安裝:apt-get install cmake
『貳』 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++
『叄』 如何在makefile中指定所使用的編譯器
可以使用定義變數來操作
比如定義變數CC
CC=gcc ->x86桌面版的編譯器
CC= arm-linux-gcc ->arm版編譯器
然後在makefile的編譯命令中使用$(CC)就代表了你指定的編譯器
『肆』 編譯器如何指定cpu類型
只有完整的 Visual Studio 產品才支持此優化。
「目標 CPU」(C# 中為「平台目標」
)項目屬性指定編譯器是否應針對特定的 CPU 類型(如 64 位處理器)優化編譯。
可以將目標平台設置為所有 CPU 類型或 x86、x64 或 Itanium 之類的特定 CPU 類型。
默認情況下,此選項設置為「AnyCPU」(C# 中為「Any CPU」
),以指定編譯器不針對特定的 CPU 類型優化編譯。
注意對於在以下說明中使用的某些 Visual Studio 用戶界面元素,您的計算機可能會顯示不同的名稱或位置。
『伍』 linux模塊編譯時,默認的編譯器是什麼怎麼有時候指定了CC=arm-linux- 但是command裡面沒有用到CC
默認的編譯器是gcc。
在linux 里 gcc 便是cc,兩者是沒區別的,gcc前面的g是代表GNU(至於GNU的意思,你可以查網路之類,關於linux的歷史了)的意思。
假如如沒有cc,你查下gcc有沒有。假如沒有,說明你裝的是交叉編譯工具arm-linux-gcc。
CC=arm-linux- 應該是 CC=arm-linux-gcc。
arm-linux-gcc 應該是用來編譯嵌入式的。
『陸』 如何為qt指定編譯器arm-xilinx-linux
修改$QTDIR/mkspecs目錄下的符號鏈接default.將其指向linux-g++
$QTDIR是路徑,具體要看你把QT裝到什麼地方和QT本身的版本,一般是/usr/lib[64]/qt4
修改default符號鏈接的作用是讓qmake在生成Makefile的時候將Makefile文件中的編譯器變數$CC與$CXX賦值成gcc和g++
『柒』 在編譯uClinux的時候,他的編譯器是自動選擇的嗎我只用了 make 命令,他就開始編譯了!
你要制定編譯器的話,肯定是在環境變數哪裡設置好的。你之前安裝的GCC也是設置好環境變數的哦
『捌』 cmake 在Windows 命令行怎麼指定編譯器
CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。
通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。
如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。
總之,CMake是一個非常強大的編譯自動配置工具,支持各種平台,KDE也是用它編譯的,感興趣的可以試用一下。
准備活動:
(1)安裝cmake。
下載地址:http://www.cmake.org/cmake/resources/software.html
根據自己的需要下載相應的包即可,Windows下可以下載zip壓縮的綠色版本,還可以下載源代碼。
Windows下CMake的使用
(2)運行cmake的方法。(GUI、命令行)
http://www.cmake.org/cmake/help/runningcmake.html
CMake使用步驟:
運行GUI的cmake界面:
cmake-2.8.1-win32-x86\bin\cmake-gui.exe
Windows下CMake的使用
執行Configure:
運行之後,生成了如下文件:
Windows下CMake的使用
生成Makefile:
執行Generate之後生成如下文件:
Windows下CMake的使用
運行make進行編譯:
Windows下CMake的使用
編譯完成後,在build目錄生成Tutorial.exe,運行Tutorial.exe 25就可以看到運行結果:
Windows下CMake的使用
運行make install安裝程序:
Windows下CMake的使用
運行make test進行測試:
Windows下CMake的使用
通過cmake tutorial學習CMake配置方法
http://www.cmake.org/cmake/help/cmake_tutorial.html
可以在源代碼的Tests/Turorial目錄中找到這個手冊對應的代碼。
Windows下CMake的使用
1、Step1。
(如果不知道如何使用cmake,以及如何使用編譯產生的Turorial.exe,可先看下前面「CMake使用步驟」的說明,它以Step4為例詳細介紹了使用過程,Step1的配置可能不夠完全,比如無法運行make install,無法運行make test,但可以參考。)
簡單的程序編譯。
(1)運行GUI的cmake,指定要編譯的源代碼路徑和二進制文件路徑(會自動創建)。
Windows下CMake的使用
(2)點擊Configure,配置成功後,再點擊Generate。
配置需要選擇合適的編譯器,雖然我安裝了VC2008,但沒有配置成功;選擇Unix Makefiles,配置成功,它自動找到了DevC++下的gcc.exe等編譯器。
Windows下CMake的使用
(3)在build3目錄執行make,就能夠編譯生成Turorial.exe了。
D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>make
Linking CXX executable Tutorial.exe
[100%] Built target Tutorial
可以運行一下Turorial.exe:
D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>Tutorial.exe
Tutorial.exe Version 1.0
Usage: Tutorial.exe number
D:\Projects\Lab\testngpp\cmake-2.8.1\Tests\Tutorial\Step1\build3>Tutorial.exe 4
The square root of 4 is 2
2、Step2
把子目錄編譯為庫,並且鏈接到最終的可執行文件。
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions) # 使得子目錄MathFunctions也能被編譯
# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial MathFunctions)
產生makefile:
在GUI上點擊Configure,之後Generate還是灰色,再次點擊Configure,Generate就可以點擊了。
編譯:
『玖』 什麼是編譯器
編譯器
編譯器是一種特殊的程序,它可以把以特定編程語言寫成的程序變為機器可以運行的機器碼。我們把一個程序寫好,這時我們利用的環境是文本編輯器。這時我程序把程序稱為源程序。在此以後程序員可以運行相應的編譯器,通過指定需要編譯的文件的名稱就可以把相應的源文件(通過一個復雜的過程)轉化為機器碼了。
[編輯]編譯器工作方法
首先編譯器進行語法分析,也就是要把那些字元串分離出來。然後進行語義分析,就是把各個由語法分析分析出的語法單元的意義搞清楚。最後生成的是目標文件,我們也稱為obj文件。再經過鏈接器的鏈接就可以生成最後的可執行代碼了。有些時候我們需要把多個文件產生的目標文件進行鏈接,產生最後的代碼。我們把一過程稱為交叉鏈接。
一個現代編譯器的主要工作流程如下:
* 源程序(source code)→預處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執行程序(executables)
工作原理
編譯是從源代碼(通常為高級語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低級語言或機器言)。然而,也存在從低級語言到高級語言的編譯器,這類編譯器中用來從由高級語言生成的低級語言代碼重新生成高級語言代碼的又被叫做反編譯器。也有從一種高級語言生成另一種高級語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。
編譯器種類
編譯器可以生成用來在與編譯器本身所在的計算機和操作系統(平台)相同的環境下運行的目標代碼,這種編譯器又叫做「本地」編譯器。另外,編譯器也可以生成用來在其它平台上運行的目標代碼,這種編譯器又叫做交叉編譯器。交叉編譯器在生成新的硬體平台時非常有用。「源碼到源碼編譯器」是指用一種高級語言作為輸入,輸出也是高級語言的編譯器。例如: 自動並行化編譯器經常採用一種高級語言作為輸入,轉換其中的代碼,並用並行代碼注釋對它進行注釋(如OpenMP)或者用語言構造進行注釋(如FORTRAN的DOALL指令)。
預處理器(preprocessor)
作用是通過代入預定義等程序段將源程序補充完整。
編譯器前端(frontend)
前端主要負責解析(parse)輸入的源程序,由詞法分析器和語法分析器協同工作。詞法分析器負責把源程序中的『單詞』(Token)找出來,語法分析器把這些分散的單詞按預先定義好的語法組裝成有意義的表達式,語句 ,函數等等。 例如「a = b + c;」前端詞法分析器看到的是「a, =, b , +, c;」,語法分析器按定義的語法,先把他們組裝成表達式「b + c」,再組裝成「a = b + c」的語句。 前端還負責語義(semantic checking)的檢查,例如檢測參與運算的變數是否是同一類型的,簡單的錯誤處理。最終的結果常常是一個抽象的語法樹(abstract syntax tree,或 AST),這樣後端可以在此基礎上進一步優化,處理。
編譯器後端(backend)
編譯器後端主要負責分析,優化中間代碼(Intermediate representation)以及生成機器代碼(Code Generation)。
一般說來所有的編譯器分析,優化,變型都可以分成兩大類: 函數內(intraproceral)還是函數之間(interproceral)進行。很明顯,函數間的分析,優化更准確,但需要更長的時間來完成。
編譯器分析(compiler analysis)的對象是前端生成並傳遞過來的中間代碼,現代的優化型編譯器(optimizing compiler)常常用好幾種層次的中間代碼來表示程序,高層的中間代碼(high level IR)接近輸入的源程序的格式,與輸入語言相關(language dependent),包含更多的全局性的信息,和源程序的結構;中層的中間代碼(middle level IR)與輸入語言無關,低層的中間代碼(Low level IR)與機器語言類似。 不同的分析,優化發生在最適合的那一層中間代碼上。
常見的編譯分析有函數調用樹(call tree),控制流程圖(Control flow graph),以及在此基礎上的變數定義-使用,使用-定義鏈(define-use/use-define or u-d/d-u chain),變數別名分析(alias analysis),指針分析(pointer analysis),數據依賴分析(data dependence analysis)等等。
上述的程序分析結果是編譯器優化(compiler optimization)和程序變形(compiler transformation)的前提條件。常見的優化和變新有:函數內嵌(inlining),無用代碼刪除(Dead code elimination),標准化循環結構(loop normalization),循環體展開(loop unrolling),循環體合並,分裂(loop fusion,loop fission),數組填充(array padding),等等。優化和變形的目的是減少代碼的長度,提高內存(memory),緩存(cache)的使用率,減少讀寫磁碟,訪問網路數據的頻率。更高級的優化甚至可以把序列化的代碼(serial code)變成並行運算,多線程的代碼(parallelized,multi-threaded code)。
機器代碼的生成是優化變型後的中間代碼轉換成機器指令的過程。現代編譯器主要採用生成匯編代碼(assembly code)的策略,而不直接生成二進制的目標代碼(binary object code)。即使在代碼生成階段,高級編譯器仍然要做很多分析,優化,變形的工作。例如如何分配寄存器(register allocatioin),如何選擇合適的機器指令(instruction selection),如何合並幾句代碼成一句等等。