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
。。。。