编译工具
文章平均质量分 75
我什么都布吉岛
Keep writing,Keep thinking!
展开
-
理解和创建Windows和Linux下的动态和静态库区别
然而,库并不是单一的:它们可以是动态的,也可以是静态的,每一种类型都有其使用场景。为了保证动态库的使用效率,Windows默认情况下将动态库的所有符号都进行了隐藏,也就是默认不输出;而Linux则是将所有符号进行了输出,所幸的是,它们都有相应的关键字进行可见性的控制。Linux和Windows对于生成库的默认行为不同,前者在默认情况下是全部导出的,后者则是需要显式说明导出的符号。从而导致没有办法使用其中的库,其实就是因为没有相应标记输出的符号,如果没有输出符号,Windows当然也不会为你生成对应的代码。原创 2023-06-11 18:00:33 · 2200 阅读 · 0 评论 -
(十七)CMake编写并使用自定义库(Windows)
介绍了CMake在Windows下动态和静态库生成和使用方法。原创 2022-07-12 11:08:26 · 2150 阅读 · 0 评论 -
(十六)CMake 增加一个库
介绍了CMAKE命令:add_library三种情况及其适用范围。原创 2022-07-10 10:48:31 · 1076 阅读 · 0 评论 -
VSCODE(一)为什么是VSCODE?
VSCODE特点丰富的智能提示(编写);代码调试功能(调试);Git支持(管理);跨平台(迁移)。基本上编译器都具有的功能,毫无疑问VSCODE做到了所有。那么有没有自己的特点?有!VSCODE长处文档丰富,快捷键组合丰富;开箱即用,既有图形,益有JSON设置;性能较好,不断提升;插件丰富,统一的插件市场,超过1W个插件;生态开放,LSP、DAP和Monaco组件开放。...原创 2020-12-06 10:33:27 · 557 阅读 · 0 评论 -
VSCODE(二)核心组件
VSCODE都有哪些重要的组件?他的优点是什么?ElectronMonaco EditorTypeScriptLanguage Sever ProtocolDebug Adapter ProtocolXterm.js一、Electron是由Github开发的一种利用前端技术栈完成跨平台界面编写开源框架。这个组件可以开发任何跨平台GUI界面,而不局限于VSCODE中的编辑器。二、Monaco EditorMonaco Editor是一个基于浏览器的代码编辑器,它能让浏览器具备代码编辑功原创 2020-12-06 18:03:01 · 1496 阅读 · 0 评论 -
VSCODE(三)用户界面
一、设置1.1 用户设置和工作区设置用户设置(User Setting): 所有VSCODE实例都有效的设置;工作区设置(Workspace Setting):当前工作区有效的设置。工作区设置可以上传到服务器上方便所有成员共享。1.2 打开设置VSCODE有途径进行VSCODE设置,分别是JSON和UI方式。那么如何打开JSON或UI进行设置呢?菜单栏选取。FIle-Preference-Settings(Linux);Code-Preference-Settings(Mac);命令面板搜索。原创 2020-12-10 18:44:51 · 8798 阅读 · 0 评论 -
VSCODE(四)编辑功能
文件资源管理器文件资源管理器菜单时我们点击侧边栏EXPLORER后再侧边栏出现的界面。如下图:默认情况下,VSCODE将会隐藏一些文件,如(.git文件夹),可以通过配置files.exclude来隐藏文件或文件夹。下面是自带的exclude文件或文件夹:"files.exclude":{ "**/.git":true, "**/.svn":true, "**/.hg":true, "**/CVS":true, "**/.DS_Store":true}这个技巧对于强迫症太受用了,比如原创 2020-12-11 15:42:12 · 6784 阅读 · 0 评论 -
VSCODE(五)终端
在实际开发中,经常会用到终端进行操作。为了减少外部终端与VSCODE之间的频繁切换,VSCODE内置了集成终端界面方便我们操作。如何打开?最简单的方式就是:ctrl+‘`‘。打开后的界面如下:下拉框可以管理已存在终端、默认终端、终端的设置。VS可以创建多个终端ctrl+shift+‘`‘,你也可以在通过下拉栏中开启split成左右两个终端ctrl+shift+5。配置终端VSCODE有默认终端:Linux/macOS:$SHELLWindows10:PowerShell早期Windows:原创 2020-12-12 13:26:23 · 10340 阅读 · 0 评论 -
VSCODE(六)Task 任务
前面的几节讲了如何将编译器“调教”成自己喜欢的样子、如何利用编译器提高我们的编码效率,那么写好的程序该如何编译运行呢?我们都知道原创 2020-12-12 23:09:09 · 6110 阅读 · 0 评论 -
VSCODE(七)创建C++编译任务
本文首先翻译了VSCODE官方文档对Task描述,然后通过C/C++的例子来说明自动化工具在VSCODE中的体现,最后介绍了如何配置Task,完成C/C++的编译任务。一、官方文档关于Task的描述自动化任务工具在linting(代码校验)、building(编译)、packaging(打包)、testing(测试)或者部署(部署)广泛的存在于工程实践中,如:TypeScript(编译器),ESLint、TSLint(代码校验)、Make CMake Gulp Jake Rake(编译系统)。这些工具原创 2020-12-14 15:01:45 · 4476 阅读 · 0 评论 -
VSCODE(八)launch 调试与运行
一、官方文档关于调试功能的描述强大的调试支持是VSCODE重要特性。VSCODE内置的调试器帮助您加快编辑、编译和调试循环。VSCODE内置了Node.js运行时支持,也就是说,能够可以调试JavaScript,TypeScript或任何其他可转换为JavaScript的语言。要调试其他语言和运行时(包括PHP,Ruby,Go,C#,Python,C ++,PowerShell和许多其他语言),请在VS Code Marketplace中查找Debugger扩展,或在顶层“运行”菜单中选择“安装其他调试原创 2020-12-16 18:37:39 · 21358 阅读 · 0 评论 -
VSCODE(九)定制自己的调试属性
前面一节简单的介绍了VSCODE的简单调试功能,对于复杂的调试应用需要我们配置launch.json调试器配置文件。一、launch.json的属性1.1 必要属性type:调试器类型request:调试器模式launchattachname:配置名1.2 可选属性presentation:order、group和hidden属性定义调试配置的显示preLaunchTask:调试前任务postDebugTask:调试后任务internalConsoleOptions:定义调原创 2020-12-17 11:11:49 · 2107 阅读 · 0 评论 -
VSCODE(十)C++语言特有设置
C/C++插件为C/C++开发者提供了丰富的设置项,包括三个方面的设置:env:用户自定义的变量,可以通过类似$<var>$或者$env:<var>$形式进行变量替换configurations:定义了包括但不限于编译器、头文件路径、C++标准在内的多种设置version:定义了c_cpp_propertie.json的版本,一般不修改我们重点关注configuration,它既可以通过settings.json,也可以通过特有的c_cpp_properties.json原创 2022-03-12 17:27:05 · 4093 阅读 · 0 评论 -
(一)CMake 编译单个源文件
什么是cmake?cmake是一个编译工具,使用CMakeList.txt文件创建makefile,从而实现程序的编译链接,它解决了:不同系统之间makefile书写上的差异,具有跨平台的优点书写语法较简单怎么用cmake生成可执行程序假设我们要编译一个名字叫做main.cpp的文件,内容如下:#include <iostream>int main(){ std.........原创 2019-01-20 17:06:12 · 1395 阅读 · 0 评论 -
(二)CMake 使用头文件
源文件如何和头文件一起编辑?operation.cpp:#include &quot;operation.h&quot;int add(int a,int b){ return a+b;}operation.h#ifndef _OPERTION_H#define _OPERTION_Hint add(int a,int b);#endifmain.cpp#include &amp;lt;i...原创 2019-01-20 17:28:49 · 13366 阅读 · 6 评论 -
(三)CMake的多源文件编译
工作目录下有多个源文件,那么CMakeLists.txt 手动键入源文件名称,很麻烦。文件结构如下.├── CMakeLists.txt├── main.cpp├── multiple.cpp├── operation.cpp└── operation.h文件内容multiple.cppint mul(int a,int b){ return a*b;}operat...原创 2019-01-20 18:04:24 · 2405 阅读 · 0 评论 -
(四)CMake编译选项
一、cmake、make的本质是编译选项的组织集合本质上来说,make和cmake都是协助你进行编译的工具,用户完全可以通过g++ gcc按照编译器要求来进行直接编译,只不过make和cmake根据各自认为合适的组织规则方便我们进行编译管理罢了。如增加一个线程库:g++ *.cpp -o -lpthread test这是g++编译器要求的样子。所有包含头文件、库文件、打包和链接库等操作都通过-选项来完成。make为了减少和整合编译逻辑,将一些例如打包ar操作封装在一个变量AR中;一些编译器专用的选原创 2020-11-16 11:16:23 · 4363 阅读 · 0 评论 -
(五)CMake与OpenCV
直接看CMakeLists.txt是怎么写的吧![1]# cmake needs this linecmake_minimum_required(VERSION 2.8)# Define project nameproject(opencvTest)# Find OpenCV, you may need to set OpenCV_DIR variable# to the absolute path to the directory containing OpenCVConfig.cmake原创 2020-11-16 11:43:48 · 794 阅读 · 0 评论 -
(六)CMake与FFTW
一、FFTW是什么?FFTW(The Fastest Fourier Transform in the West )是一个用于计算离散傅里叶变换的软件库,由麻省理工学院的Mattteo Frigo和Steven G.Johnson开发的。FFTW的名字意思是西方最快的傅里叶变换。它可以在O(nlogn)时间内计算任意大小和维数的实数和复数值数组的变换。[1]二、如何配置?我的配置方法是:在Ubuntu系统下,使用CMake工具,在VSCODE中完成程序编写和测试。2.1 下载和解压官网-下载-解压原创 2020-11-23 00:02:49 · 3721 阅读 · 0 评论 -
(七)CMake变量及其设置
CMake变量设置方法如下:set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])一个简单的例子:set(Books novel1 novel2 novle3)值得注意的是,Books的值是novel1 novel2 novle3。注意区分set(Books "novel1 novel2 novle3")这里的Books的值是"novel1原创 2020-11-27 14:42:30 · 13282 阅读 · 1 评论 -
(八)CMake 在Ubuntu的更新
首先卸载原来的cmake:sudo apt remove cmake官网下载cmake工具包,修改权限并设置安装路径:chmod + x cmake-3.19.2-Linux-x86_64.shsudo ./cmake-3.19.2-Linux-x86_64.sh --skip-license --exclude-subdir --prefix=/usr/local看看版本,更新成功。...原创 2020-12-24 11:46:36 · 414 阅读 · 0 评论 -
(九)CMake与环境变量
cmakecmake中对环境变量读写都是通过ENV前缀来访问环境变量读取环境变量则要使用 $ENV{JAVA_HOME}这样的格式写环境变量如下:set( ENV{PATH} /home/martink )if语句判断环境变量是否定义要用下面的格式if(NOT DEFINED ENV{JAVA_HOME}) # 没有找到JAVA_HOME环境变量 message(FATAL_ERROR "not defined environment variable:JAVA_HOME")原创 2021-03-22 14:02:13 · 2583 阅读 · 0 评论 -
(十)CMake链接已有的动态库
link_directories指的是库的场所,target_link_libraries是指某一个特定库。如果可能,最好使用target_link_libraries。原创 2021-03-22 14:38:07 · 16621 阅读 · 3 评论 -
(十一)CMake的ADD_SUBDIRECTORY
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])这个命令用于添加源文件子目录,同时还可以指定中间二进制和目标二进制的生成路径。EXCLUDE_FROM_ALL将会将这个目录从编译中排除,如工程的例子需要等待其他编译完成后再进行单独的编译。与之类似的还有add_excutableadd_executable (<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL]原创 2021-03-23 17:56:14 · 4756 阅读 · 1 评论 -
(十二)CMake多个目标文件
.├── client│ └── main.cpp├── CMakeLists.txt├── main.cpp└── server └── main.cpp2 directories, 4 files这里一共生成了三个可执行文件,CMake如下:project(Demo)add_executable(demo main.cpp)add_executable(server ./client/main.cpp)add_executable(client ./client/m原创 2021-08-11 22:29:29 · 1608 阅读 · 0 评论 -
(十三)CMake MESSAGE和PROJECT
PROJECT(projectname [CXX][C][Java])命令用于指示名称,并且可以指定工程支持的语言,通常可以忽略。隐式定义了两个CMake变量,分别是:<projectname>_BINARY_DIR<projectname>_SOURCE_DIR上面的两个变量第一个下划线前的字符串等于PROJECT里面的字符串。为了打印两个CMake变量,需要用到MESSAGE打印字符串。Project(HELLO)SET(SRC_LIST main.cpp)M原创 2022-03-12 22:41:20 · 716 阅读 · 0 评论 -
(十四)内部构建和外部构建概念
假设我们有一个如下工程需要进行构建:.├── CMakeLists.txt└── main.cpp0 directories, 3 filesCMakeLists.txt的内容如下:Project(HELLO)SET(SRC_LIST main.cpp)MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})ADD原创 2022-03-12 22:55:52 · 472 阅读 · 0 评论 -
GCC的学习(一)GCC简介及其常用选项
一、什么是GCCGCC(the GNU Compiler Collection)GCC是GNU编译器集合它包括了C/C++、Objective-C、Fortran、Ada和Go语言的前端和对应的库(libstdc++)GCC初衷是为完全免费的GNU系统编写的编译器。二、程序到计算机执行一个C程序从编辑到执行需要经过以下过程:编写并保存程序(.c)->预处理(.c)成文件(.i)-&...............原创 2019-09-19 15:00:30 · 5092 阅读 · 0 评论 -
GCC的学习(二)头文件及其库制作
一、-I 头文件路径1.1 工程结构简单不需要-I选项工程若源代码及头文件数量较少根本不需要-I选项,将他们放在同一级目录下,源文件就可正常找到头文件://ttt.cpp#include <stdio.h>#include "data.h"int main(){ printf("Hello world\n"); printf("Data in header is %lf\n",pi);}// data.hdouble pi=3.1415;在终端键入:gcc ttt原创 2020-05-21 13:24:00 · 462 阅读 · 1 评论 -
GCC的学习(三)宏定义和警告
一、宏定义选项 -D在编译之时在代码中添宏定义,方便调试。#include <stdio.h>int main(){ #define DEBUG printf("I am debuging\n"); #endif}如果没有这个编译选项,我们需要在开头手动添加宏定义后(多了修改操作)。就好像这样:#include <stdio.h>#define DEBUGint main(){ #define DEBUG printf(原创 2020-05-21 14:05:44 · 1483 阅读 · 0 评论 -
GCC的学习(四)头文件搜寻顺序及环境变量
尖括号和双引号#include <iostream>#include "myhearder.h"我认为其实两种方式区别不大,但是尖括号有他的优点好:区分用户和三方或标准系统的头文件对搜索顺序进行了优化搜寻顺序graph LRA[#include指定] --> B[当前目录]B --> C[I指定目录]C-->[GCC环境变量]C --> D[系统内置]...原创 2020-11-21 14:05:12 · 727 阅读 · 0 评论 -
GCC的学习(五)动态库接口可见性
为什么C++可见性支持这么重要?简单来说,它隐藏了大多数早前是公有的(没必要)ELF符号,这也就是说:它极大的减少了装载动态库(DSO,Dynamic Shared Object)的时间。经测试,一个大型的模板库加载时间从超过6分钟变成了6秒!它使优化器产生更好的代码。PLT间接取值(当函数调用或变量访问必须通过全局偏移表(如PIC代码)进行查找时)可以完全避免,从而在很大程度上避免了现代处理器上的管道暂停,从而大大加快了代码的速度。此外,当大多数符号被本地绑定时,它们可以通过整个DSO被完全安全地翻译 2021-02-17 09:48:09 · 1706 阅读 · 0 评论 -
GCC的学习(六)__attribute__控制动态库可见性
《GCC的学习(五)动态库接口可见性》一文我翻译了一篇gcc官方文档,那么在实际中,这个可见性是如何体现的呢?设置__attribute__的优点减少了动态库装载时间方便编译器优化代码更加轻便的动态库导出所有符号的方法//fun.cpp#include <iostream>#include "fun.h"void printOne(){ std::cout<<"1"<<std::endl;}void printTwo(){原创 2021-03-23 10:46:23 · 593 阅读 · 0 评论 -
程序是以何种顺序搜索动态库的
问题描述经常出现的,找不到共享文件问题:cannot open shared object file: No such file or directory,其主要原因是没有找到共享库。不仅在程序编译时需要连接库,在运行时同样需要连接库。理解程序运行时库搜索的问题,是解决此类问题的关键。使用命令ldd查看运行时连接库情况,若没有缺失,对应行显示not found。结果可能如下:运行时库以何种顺序搜索-wl -rpath -R选项。编译时指定的运行时动态库搜索路径,注意区分编译动态库搜索路径-LLD原创 2020-11-23 10:23:44 · 210 阅读 · 0 评论 -
g++编译器版本对应功能
https://gcc.gnu.org/projects/cxx-status.html#cxx17原创 2021-02-23 17:34:57 · 535 阅读 · 0 评论 -
我对运行库的理解
一、libc、glibcLinux系统有自己的底层操作函数,如底层输入输出(Low-Level Input/Output):打开文件:open关闭文件:close读取文件:read写入文件:write操作文件指针:lseek随便拿个open作说明:int open (const char *filename, int flags, mode t mode);,如果要完成文件写入一个Hello World可不容易,因为我们必须熟悉操作系统中对flags和模式的设置,设置相当麻烦。C标准库就是原创 2020-12-20 09:47:16 · 296 阅读 · 1 评论 -
如何进行交叉编译?
交叉编译是什么?交叉编译就是“我帮你做了你不擅长或者不能做的编译工作”。交叉编译通常出现在以下场景:一台机器不能进行编译工作一台机器能进行但编译过于缓慢那么怎么解决这个问题呢?用另一台性能较好的机器帮助完成编译,这过程需要安装对应平台的交叉编译工具链,它通常包括arm-linux-gcc,arm-linux-ld,arm-linux-as等的工具,我们既可以使用现成的交叉编译工具,也可以自己定制自己的编译链。工具链来源已有的自定义的优化情况通用的优化特定的优化更原创 2021-04-04 22:19:51 · 4198 阅读 · 4 评论 -
交叉编译Qt工程
交叉编译的概念请查看我之前的一篇文章:如何进行交叉编译?本文的目标是:在Ubuntu20.04上编译Qt程序并在树莓派上运行。一、树莓派上安装合适的Qt版本如果你的板子上没有安装Qt,那么请安装对应的Qt版本。这一步非常重要,最好不要自行安装Qt版本,而是要安装发行版经过测试的、兼容的Qt版本。树莓派安装Qt也相当简单:sudo apt-get updatesudo apt-get install qt5-defaultsudo apt-get install qtcreatorsudo ap原创 2021-04-05 15:24:39 · 5248 阅读 · 4 评论