Ubuntu使用QtCreator + CMake 开发C/C++程序
平台
-
OS: Ubuntu 20.04
-
cmake: 3.16.3
-
IDE: Qt Creator 4.11.1
Based on Qt 5.14.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit)
Built on Feb 5 2020 12:48:30
From revision b2ddeacfb5
Copyright 2008-2019 The Qt Company Ltd. All rights reserved.
The program is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -
GCC/G++
GCC: Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: …/src/configure -v --with-pkgversion=‘Ubuntu 9.4.0-1ubuntu1~20.04.2’ --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)G++ Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: …/src/configure -v --with-pkgversion=‘Ubuntu 9.4.0-1ubuntu1~20.04.2’ --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-9QDOt0/gcc-9-9.4.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
源码
源码结构
├── atool.c
├── atool.cpp
├── CMakeLists.txt
├── include
│ └── atool.h
└── main.cpp
-
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)project(Test LANGUAGES CXX)set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON)add_executable(testmain.cppatool.c)
-
atool.h
#ifndef ATOOL_H #define ATOOL_H#ifdef __cplusplus extern "C"{ #endif //代码部分 int atoolInfo(); #ifdef __cplusplus } #endif#endif // ATOOL_H
-
main.cpp
#include <stdio.h> #include "include/atool.h"int main(int argc, char** argv){printf("%s argc=%d", __FUNCTION__, argc);if(argc > 0){for(int i = 0; i < argc; i ++){printf(" arg[%d]=%s", i, argv[i]);}}printf("\n");atoolInfo(); }
-
atool.cpp
#include "include/atool.h" #include "stdio.h" int atoolInfo(){printf("atoolInfo\n");return 0; }
问题 1: undefined reference to `atoolInfo’
LOG
17:32:36: 为项目Test执行步骤 …
17:32:36: 正在启动 “/usr/bin/cmake” --build . --target all[ 50%] Linking CXX executable test
/usr/bin/ld: CMakeFiles/test.dir/main.cpp.o: in functionmain': /xxx/main.cpp:13: undefined reference to
atoolInfo’
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/test.dir/build.make:84: test] Error 1
make[1]: *** [CMakeFiles/Makefile2:76: CMakeFiles/test.dir/all] Error 2
make: *** [Makefile:84: all] Error 2
17:32:36: 进程"/usr/bin/cmake"退出,退出代码 2 。
Error while building/deploying project Test (kit: Desktop Qt 5.14.2 GCC 64bit)
When executing step “CMake Build”
17:32:36: Elapsed time: 00:00.
一个很初级的问题, 检查了文件名, 文件路径, 函数申明等等… 没发现问题所在, 转悠了好久, 最终发现问题出在: project(Test LANGUAGES CXX), 解决方法是: project(Test LANGUAGES CXX C)
在CMake构建系统中,project()
命令是配置文件(CMakeLists.txt)中的一个关键指令,用于定义项目的基本属性,如项目名称、版本以及所使用的编程语言。给定的project(Test LANGUAGES CXX C)
行可以这样解读:
- 项目名称:这里的项目名称是“Test”,这意味着CMake将创建一个名为“Test”的项目,并且在内部变量
CMAKE_PROJECT_NAME
中存储这个名称。 - LANGUAGES:该选项指定了项目所使用的编程语言。在这个例子中,指定的语言包括C++(CXX)和C。这意味着CMake将在构建时准备相应的编译器工具链,并为这两种语言设置适当的编译和链接规则。
- 含义:当CMake解析到这一行时,它会根据指定的语言来寻找并处理相关的源文件。例如,对于C++源码(
.cpp
文件)和C源码(.c
文件),CMake将会生成对应的编译目标(对象文件或库)。此外,如果后续CMakeLists.txt中有使用到特定语言的命令(如add_executable
或add_library
),CMake将知道应该处理哪些类型的源代码文件。
总结来说,这行命令主要是初始化一个名为“Test”的CMake项目,同时告知CMake此项目涉及到C和C++两种编程语言的源代码编译。
cmake_minimum_required(VERSION 3.5)project(Test LANGUAGES CXX C)set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)add_executable(testmain.cppatool.c)
另外, 在头文件中, 函数的声明需要使用 extern "C"
否则同样会出现上述的问题.
#ifndef ATOOL_H
#define ATOOL_H#ifdef __cplusplus
extern "C"{
#endif
//代码部分
int atoolInfo();
#ifdef __cplusplus
}
#endifint funcNoExternC();#endif // ATOOL_H
如以上源码中, 函数funcNoExternC() 在此项目中编译出错
问题2:
LOG
18:08:33: 为项目Test执行步骤 …
18:08:33: 正在启动 “/usr/bin/cmake” --build . --target allScanning dependencies of target test
[ 33%] Building C object CMakeFiles/test.dir/main.c.o
[ 66%] Building C object CMakeFiles/test.dir/atool.c.o
[100%] Linking C executable test
gcc: warning: CMakeFiles/test.dir/main.c.o: linker input file unused because linking not done
gcc: warning: CMakeFiles/test.dir/atool.c.o: linker input file unused because linking not done
[100%] Built target test
18:08:33: 进程"/usr/bin/cmake"正常退出。
18:08:33: Elapsed time: 00:00.
这是什么错误: linker input file unused because linking not done ??
通用的解释, “这个提示通常出现在构建过程中,特别是使用CMake、Makefile或者其他构建工具链时。
当一个项目在编译阶 段生成了某些目标文件(通常是.o
或.obj
这样的对象文件),但随后的链接步骤并未执行时,就可能出现这个提示。
如果某个目标文件被传递给链接器作为输入,但由于某种原因链接步骤未被执行(例如,可能由于构建目标只涉及到了编译特定模块而没有进一步链接到可执行文件,或者在条件编译下该模块不参与最终链接等),
那么链接器就不会使用到这些目标文件,从而产生“linker input file unused because linking not done”这样的警告信息。
这通常意味着构建系统的配置需要进一步检查和调整以确保所有的目标文件在适当的时候都被正确地链接。”
原因:
-
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)project(Test LANGUAGES CXX C)set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON)#原因: set(CMAKE_C_FLAGS "-c")add_executable(testmain.catool.c)
导致这个问题原因有2点:
-
set(CMAKE_C_FLAGS “-c”):
-c
参数在CFLAGS
或直接在GCC命令行中使用时,是一个编译器标志,它告诉GCC只执行编译和汇编步骤,而不进行链接。CMAKE_C_FLAGS “-c”
在CMake中,
set(CMAKE_C_FLAGS "-c")
的作用是设置C语言编译器的编译选项。具体来说,这里设置了-c
选项,该选项通常用于告诉编译器只进行编译而不进行链接。c
选项的含义是生成目标文件而不是可执行文件。当你编写一个大型的程序时,通常会将源代码文件分为多个文件,并通过编译每个源文件生成对应的目标文件,最后再将这些目标文件链接到一起生成最终的可执行文件。使用c
选项告诉编译器只执行编译过程,生成目标文件,而不进行链接。
这通常用于加速编译过程,特别是在修改了部分源文件但不需要重新链接整个项目时。然而,如果你使用了这个选项,你可能需要手动执行链接步骤来生成最终的可执行文件。
需要注意的是,直接设置
CMAKE_C_FLAGS
可能会覆盖其他可能由CMake自动生成的编译选项。更推荐的做法是使用target_compile_options
命令,它允许你为特定的目标设置编译选项,而不是全局地设置CMAKE_C_FLAGS
。例如:target_compile_options(your_target_name PRIVATE -c)
这样可以确保你的选项只应用于特定的目标。
-
main**.c** 而不是 main**.cpp**
在CMake中,设置
-c
选项仅编译源文件而不进行链接。这意味着如果你只编译了C源文件,而没有链接生成可执行文件,你可能会看到类似于"linker input file unused because linking not done"的错误。这个错误表明编译器在链接阶段没有找到足够的信息来生成可执行文件,因为只有编译了C文件而没有链接。
解决这个问题的改法有两种:
-
保留main**.c,** 删除set(CMAKE_C_FLAGS “-c”)
-
改用main**.cpp,** 保留set(CMAKE_C_FLAGS “-c”)
参考
[C error: undefined reference to function, but it IS defined](https://stackoverflow.com/questions/5559250/c-error-undefined-reference-to-function-but-it-is-defined)
关于 C++ 中的 extern “C”
相关文章:

Ubuntu使用QtCreator + CMake 开发C/C++程序
平台 OS: Ubuntu 20.04 cmake: 3.16.3 IDE: Qt Creator 4.11.1 Based on Qt 5.14.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit) Built on Feb 5 2020 12:48:30 From revision b2ddeacfb5 Copyright 2008-2019 The Qt Company Ltd. All rights reserved. The program …...

【分布式监控】zabbix与grafana连接
1.在zabbix- server服务端安装grafana,并启动服务 先在官网下载软件 https://grafana.com/grafana/download/9.4.7?editionenterprise&pggraf&plcmtdeploy-box-1#可以翻译成中文介绍,很详细的教程 yum install -y https://dl.grafana.com/ent…...

02-编程猜谜游戏
本章通过演示如何在实际程序中使用 Rust,你将了解 let 、 match 、方法、关联函数、外部crate等基础知识。 本章将实现一个经典的初学者编程问题:猜谜游戏。 工作原理如下:程序将随机生成一个介于 1 和 100 之间的整数。然后,程序…...

Web3解密:区块链技术如何颠覆传统互联网
随着区块链技术的崛起,Web3正逐渐成为新一代互联网的代名词。它不再依赖中心化的权威机构,而是通过去中心化、透明、安全的特性,为用户带来更为开放和公正的互联网体验。本文将深入解密Web3,揭示区块链技术如何颠覆传统互联网的基…...

java小项目:简单的收入明细记事本,超级简单(不涉及数据库,通过字符串来记录)
一、效果 二、代码 2.1 Acount类 package com.demo1;public class Acount {public static void main(String[] args) {String details "收支\t账户金额\t收支金额\t说 明\n"; //通过字符串来记录收入明细int balance 10000;boolean loopFlag true;//控制循…...

域环境权限提升
Windows系统配置错误 在Windows系统中,攻击者通常会通过系统内核溢出漏来提权,但是如果碰到无法通过系统内核溢出漏洞法国提取所在服务器权限的情况,就会系统中的配置错误来提权。Windows系统中常见哦欸之错误包括管理员凭证配置错误&#x…...

【Debian】非图形界面Debian10.0.0安装xfce和lxde桌面
一、安装 1. Debian10.0.0安装xfce桌面 sudo apt update sudo apt install xfce4 startxfce4 2. Debian10.0.0安装lxde桌面 sudo apt-get install lxde安装后重启电脑。 二、说明 XFCE、LXDE 和 GNOME 是三个流行的桌面环境,它们都是为类 Unix 操作系统设计…...

极狐GitLab 线下『 DevOps专家训练营』成都站开班在即
成都机器人创新中心联合极狐(GitLab)隆重推出极狐GitLab DevOps系列认证培训课程。该课程主要面向使用极狐GitLab的DevOps工程师、安全审计人员、系统运维工程师、系统管理员、项目经理或项目管理人员,完成该课程后,学员将达到DevOps的专家级水平&#x…...

片外存储器_FLASH的页、扇区、块介绍
目录标题 1、什么是FLASH存储器?2、Flash中页、扇区、块是什么意思?有什么区别?2.1、芯片内部框图2.2、页2.3、扇区2.4、块2.5、包含示意图 3、使用FLASH 时候,必须知道的事。 1、什么是FLASH存储器? FLASH属于广义的ROM&#x…...
Python——字符串的基本操作
⼀、 创建 s1 lenovo s2 "QF" s3 """hello lenovo""" s4 hello 亮 s5 """hello shark """ s6 hello world ⼆、简单使⽤ 1.\ 转义符 testimony This shirt doesn\t fit me words hello \ns…...
【cuda】四、基础概念:Cache Tiled 缓存分块技术
缓存分块是一种内存优化技术,主要用于提高数据的局部性(Locality),以减少缓存未命中(Cache Miss)的次数。在现代计算机体系结构中,处理器(CPU)的速度通常比内存快得多。因…...

[C#]winform部署openvino官方提供的人脸检测模型
【官方框架地址】 https://github.com/sdcb/OpenVINO.NET 【框架介绍】 OpenVINO(Open Visual Inference & Neural Network Optimization)是一个由Intel推出的,针对计算机视觉和机器学习任务的开源工具套件。通过优化神经网络ÿ…...
Java中对日期的处理
Java中对日期的处理 这个案例主要掌握: 1.怎么获取系统当前时间 2.String-->Date 3.Date-->String Import java.text.SimpleDateFormat; Import java.util.Date; public class DateTest01{ public static void main(String[] args) throws Exception{ //获取…...

【Linux install】Ubuntu和win双系统安装及可能遇到的所有问题
文章目录 1.前期准备1.1 制作启动盘1.2关闭快速启动、安全启动、bitlocker1.2.1 原因1.2.2 进入BIOSshell命令行进入BIOSwindows设置中高级启动在开机时狂按某个键进入BIOS 1.2.3 关闭Fast boot和Secure boot 1.3 划分磁盘空间1.3.1 查看目前的虚拟内存大小 2.开始安装2.1 使用…...

Helm Dashboard — Kubernetes 中管理 Helm 版本的 GUI
Helm Dashboard 通过提供图形用户界面,使在 Kubernetes 中管理 Helm 版本变得更加容易,这是许多开发人员所期望的。它可用于在 Kubernetes 中创建、部署和更新应用程序的版本,并跟踪其状态。 本文将探讨 Helm Dashboard 提供的特性和优势&am…...
【Guava笔记01】Guava Cache本地缓存的常用操作方法
这篇文章,主要介绍Guava Cache本地缓存的常用操作方法。 目录 一、Guava Cache本地缓存 1.1、引入guava依赖 1.2、CacheBuilder类 1.3、Guava-Cache使用案例...

Flink(十三)【Flink SQL(上)SqlClient、DDL、查询】
前言 最近在假期实训,但是实在水的不行,三天要学完SSM,实在一言难尽,浪费那时间干什么呢。SSM 之前学了一半,等后面忙完了,再去好好重学一遍,毕竟这玩意真是面试必会的东西。 今天开始学习 Flin…...

Labview局部变量、全局变量、引用、属性节点、调用节点用法理解及精讲
写本章前想起题主初学Labview时面对一个位移台程序,傻傻搞不清局部变量和属性节点值有什么区别,概念很模糊。所以更新这篇文章让大家更具象和深刻的去理解这几个概念,看完记得点赞加关注喔~ 本文程序源代码附在后面,大家可以自行下…...
openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c
文章目录 openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c概述笔记END openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c 概述 ED25519 签名/验签算法, 现在是最好的. 产生ED25519私钥/公钥 用私钥对明文签名, 得到签名数据 用公钥对明文…...
AI辅助编程工具—Github Copilot
一、概述 Copilot是一种基于Transformer模型的神经网络,具有12B个参数。是GitHub和OpenAPI共同开发的编程辅助工具。GitHubCopilot是一款由人工智能驱动的结对编程编辑器,旨在帮助开发人员更加高效地工作。它利用OpenAICodex技术,将开发…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...