gcc手工編譯rc文件
㈠ CMAKE_RC_COMPILER 是什麼東西
cmake vs qmakeqmake 是為 Qt 量身打造的,使用起來非常方便cmake 使用上不如qmake簡單直接,但復雜換來的是強大的功能內置的 out-of source 構建。(目前QtCreator為qmake也默認啟用了該功能,稱:shadow build)為各種平台和場景提供條件編譯可處理多個可執行文件情況,和很好配合 QtTest 工作如何選擇?Using CMake to Build Qt Projects 一文中說:對簡單的Qt工程,採用 qmake對復雜度超過 qmake 處理能力的,採用 cmake盡管如此,如果簡單Qt的工程都不知道怎麼用 cmake 構建,復雜的工程,就更不知道如何使用 cmake 了。還是從簡單的學起吧簡單的 Qt 程序#include <QtCore/QCoreApplication>#include <QtCore/QDebug>int main(int argc, char** argv){ QCoreApplication app(argc, argv); qDebug()<<"hello qt!"; app.exec();}如果不使用構建工具,直接調用編譯器來編譯的話,只需要類似這樣的一條命令:g++ main.cpp -Ie:\Qt\4.7.0\include -o main -Le:\Qt\4.7.0\lib -lQtCore4指定頭文件目錄,以及需要鏈接的庫qmakeqmake 需要一個 .pro 文件:CONFIG += qtQT -= guiSOURCES += main.cpp因為我們需要 Qt的庫和頭文件,所以需要 CONFIG += qt 。這是默認項,可直接去掉該行啟用qt後,可以通過 QT -= gui 來進一步細調我們需要的模塊默認是 core gui。我們不需要gui模塊,故去掉。cmakecmake 需要一個 CMakeLists.txt 文件:PROJECT(example)FIND_PACKAGE(Qt4 REQUIRED)SET(QT_DONT_USE_QTGUI TRUE)INCLUDE(${QT_USE_FILE})ADD_EXECUTABLE(example main.cpp)TARGET_LINK_LIBRARIES(example ${QT_LIBRARIES})FIND_PACKAGE 來啟用 Qt4默認使用了core 和 gui,故手動禁用 QTGUI這兩行可以直接使用 FIND_PACKAGE(Qt4 COMPONENTS QtCore REQUIRED),未指定的模塊將被禁用包含一個CMake為Qt提供的配置文件,${QT_USE_FILE}變數是一個文件名添加可執行程序目標鏈接到 Qt 的庫復雜一點考慮一個常規Qt程序:main.cppmainwindows.uimainwindows.hmainwindows.cpp如果手動編譯的話:mainwindow.ui 需要使用 uic 預處理uic mainwindow.ui -o ui_mainwindow.hmainwindow.h 需要 moc 預處理moc mainwindow.h -o moc_mainwindow.cpp調用編譯器進行編譯g++ main.cpp mainwindow.cpp moc_mainwindow.cpp -Ie:\Qt\4.7.0\include -o main -Le:\Qt\4.7.0\lib -lQtCore4 -lQtGui4qmake使用 qmake 的的話,一個簡單的 pro 文件TARGET = exampleTEMPLATE = appSOURCES += main.cpp mainwindow.cppHEADERS += mainwindow.hFORMS += mainwindow.uiHEADERS 中的文件是否需要 moc 進行預處理,qmake 運行時會根據其是否含有Q_OBJECT自動判斷。這也是為什麼 很多人添加Q_OBJECT宏後不重新運行qmake會出錯誤的原因。cmake看看相應的 cmake 的 CMakeLists.txt 文件PROJECT(example)CMAKE_MINIMUM_REQUIRED(VERSION 2.6)FIND_PACKAGE(Qt4 REQUIRED)INCLUDE(${QT_USE_FILE})INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})QT4_WRAP_CPP(example_MOCS mainwindow.h)QT4_WRAP_UI(example_UIS mainwindow.ui)ADD_EXECUTABLE(example main.cpp mainwindow.cpp ${example_MOCS})TARGET_LINK_LIBRARIES(example ${QT_LIBRARIES})需要 moc 的文件,用 QT4_WRAP_CPP 處理生成的文件放入變數 example_MOCS 中,最後一塊鏈接到可執行程序需要 uic 的文件,用 QT4_WRAP_UI 處理Windows因為windows下鏈接時分為 console 和 windows 兩個子系統,所以windows下有些問題需要特殊處理。用 qmake 時:默認是 windows 子系統可以通過 CONFIG += console 使用 console 子系統用 cmake 是:默認是 console 子系統使用 windows 子系統需要SET(QT_USE_QTMAIN TRUE)ADD_EXECUTABLE(example WIN32 main.cpp mainwindow.cpp ${example_MOCS})前者啟用 qtmain.lib 庫來提供windows下的 WinMain 入口函數。後者鏈接 windows 子系統再復雜一點main.cppmainwindows.uimainwindows.hmainwindows.cppmain.qrcmain.rc前面已經用到了Qt的 moc 和 uic,這次增加了資源系統 需要用 rccrcc main.qrc -o qrc_main.cpp同時,使用了windows下的資源文件 .rc (比如給程序添加圖標)MVSC 中使用 rc.exe 對 .rc 文件進行處理MinGW 中使用 windres.exe 處理 .rc 文件qmakeTARGET = exampleTEMPLATE = libHEADERS = mainwindow.h widget.hSOURCES = main.cpp widget.cpp mainwindow.cppRESOURCES = main.qrcRC_FILE = main.rccmakePROJECT(example)CMAKE_MINIMUM_REQUIRED(VERSION 2.6)FIND_PACKAGE(Qt4 REQUIRED)SET(QT_USE_QTMAIN TRUE)INCLUDE(${QT_USE_FILE})INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})if(MINGW) set(CMAKE_RC_COMPILER_INIT windres) ENABLE_LANGUAGE(RC) SET(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")endif(MINGW)SET(example_SRCS main.cpp mainwindow.cpp widget.cpp res/main.rc)SET(example_MOC_SRCS mainwindow.h widget.h)QT4_WRAP_CPP(example_MOCS ${example_MOC_SRCS})QT4_ADD_RESOURCES(example_RCC_SRCS main.qrc)SET(example_SRCS ${example_SRCS} ${example_MOCS} ${example_RCC_SRCS})ADD_EXECUTABLE(example WIN32 main.cpp mainwindow.cpp ${example_SRCS})TARGET_LINK_LIBRARIES(example ${QT_LIBRARIES})對Qt的資源文件,使用 QT4_ADD_RESOURCES 來調用rcc進行預處理對 Windows 資源文件,直接和源文件一樣,添加到列表中即可。只是:MinGW 下僅僅這么做還不行,上面的 MinGW 塊用來修復這個問題Debug 與 Releaseqmake使用 qmake 時,可以在 pro 文件內分別為兩種模式設置不同的選項。使用時,可以直接 make release 或 make debug 來編譯不同的版本cmake不同於 qmake,由於 cmake 採用 out-of-source 方式。故:建立debug release兩目錄,分別在其中執行cmake -DCMAKE_BUILD_TYPE=Debug(或Release)需要編譯不同版本時進入不同目錄執行make對生成 msvc 工程的情況, CMAKE_BUILD_TYPE 不起作用。生成工程後使用IDE自帶的模式選擇。㈡ 正點原子嵌入式linux驅動開發——Linux C編程入門
這一章主要利用Ubuntu自帶的vi編輯器進行C語言代碼編寫。對原理不感興趣的讀者,可以自行搜索並使用VSCode等編輯器進行操作。
首先,創建一個名為"C_Program"的文件夾,用於管理所有代碼。每次編寫的代碼放在"C_Program"文件夾下的子文件夾中,便於管理。
在"/etc/vim/vimrc"文件中,設置tab為4個空格,並啟用行號顯示,通過在文件最後兩行添加相應的代碼實現。
設置完成後的vi編輯器,用於編寫經典代碼"Hello World!"。創建名為"main.c"的文件,內容如下:
使用"cat"命令查看內容,如圖所示。
進行代碼編譯。Ubuntu下的C語言編譯器為GCC,若Ubuntu18未安裝GCC工具,需手動安裝gcc、g++和make等工具。通過安裝"build-essential"軟體包即可。安裝完成後,使用命令查看,如圖所示。
安裝成功後,GCC編譯器版本為7.5.0,適用於x86架構CPU。對於ARM架構,需要使用針對ARM的GCC編譯器,即交叉編譯器。需記住不同架構下的GCC編譯器不同。
使用GCC編譯器編譯"main.c"文件,GCC命令模式下輸入命令,編譯完成後生成可執行文件"a.out",使用命令"./a.out"執行,如圖所示。
可自定義命名生成的可執行文件,在使用gcc命令時加上"-o"指定文件名,如編譯"main.c"後生成名為"main"的可執行文件,操作如圖所示。
GCC編譯器命令格式如下,主要選項如下:
編寫示例代碼演示GCC錯誤警告,代碼中有兩處錯誤:在第8行少寫了一個分號;第9行中的printf語句錯誤。編譯後,GCC會給出錯誤提示,根據提示修改代碼即可。
GCC編譯流程包括預處理、編譯、匯編和鏈接,預處理展開頭文件、替換宏、解析條件編譯;編譯將預處理後的代碼編譯成匯編代碼;匯編將匯編語言編譯成二進制目標文件;鏈接將多個目標文件鏈接成可執行文件。
使用make命令進行編譯,通過一個Makefile文件描述編譯哪些源碼文件、如何編譯。Makefile跟腳本文件類似,執行系統命令,使用make命令即可自動完成工程編譯,提高開發效率。在Linux下使用最多的GCC編譯器,需要自行編寫Makefile。
創建名為"Makefile"的文件,描述工程中需要編譯的源碼文件和依賴關系。在命令行輸入"make"即可編譯工程,可能遇到編譯失敗的情況。修改Makefile,確保在修改文件後能正確編譯。Makefile中規則描述目標文件及其依賴文件,命令執行更新。
總結,Makefile中規則定義目標文件及其依賴文件,命令執行更新。Makefile的"終極目標"是Makefile文件中第一個規則的目標,沒有指定目標時,默認為目標。Makefile變數用於簡化代碼,變數賦值使用"="或"==","=="只使用已定義的值。模式規則用於編譯所有以特定後綴結尾的文件,自動化變數用於簡化命令執行。Makefile中的偽目標不生成文件,用於避免與實際文件沖突。Makefile支持條件判斷和函數調用,實現邏輯控制和字元串處理。
本章節介紹了在Linux環境下使用GCC和Makefile進行C語言代碼的編譯和執行。學習後可直接進行實踐,實踐過程中會更直觀地理解操作流程。基礎了解即可,具體應用需在實踐中深入體會。
㈢ C語言編譯.o時提示undefined reference to `main'怎麼辦
一般是缺少相應的頭文件,新建項目時 選擇console application,不要選MFC的那種項目。
主函數應該寫成int main(),你寫成mian了。
㈣ C語言程序編譯後產生哪些類型的文件這些文件的作用是什麼
不同的系統,產生的文件不一樣;
win:
->.obj目標文件
->.obj目標文件->.exe可執行文件
->.rc
。。。。