从第一个linux下的HelloWorld 写起(1)

在这里插入图片描述
#include
using namespace std;
//有了这句话下面的cin cout 以及endl 不用写成 std::cin std::cout 可以直接写cin cout
//可以直接使用std类里的所有函数不用加std
/*
或者这样写,不免有些繁琐
using std::cin;
using std::cout;
using std::endl;
*/
int main()
{

cout<<“Hello”<<endl;
return 0;

}
建立一个try_catch.cpp文件 里面有如下代码。(可以自己起别的名字,比如hello.cpp)
在这里插入图片描述输入g++命令 编译文件 g++ try_catch.cpp -o try_catch
在这里插入图片描述
./try_catch 输入此命令来运行生成的可执行文件

在这里插入图片描述建立三个文件
hello.h文件代码:
#ifndef HELLO_H
#define HELLO_H

int HELLO();

#endif
hello.cpp 代码:
#include
#include “hello.h”
using namespace std;
int HELLO()
{

cout<<“Hello”<<endl;
return 0;

}

catch.cpp 代码:
#include
#include “hello.h”
using namespace std;
//有了这句话下面的cin cout 以及endl 不用写成 std::cin std::cout 可以直接写cin cout
//可以直接使用std类里的所有函数不用加std
/*
或者这样写,不免有些繁琐
using std::cin;
using std::cout;
using std::endl;
*/
int main()
{

HELLO();
return 0;

}

在这里插入图片描述
单独输入 g++ hello.cpp 对hello.cpp文件报错 缺少main函数
在这里插入图片描述
输入 g++ -c hello.cpp 编译成功 一个obj文件

在这里插入图片描述
若直接 g++ hello.cpp 会报出没有main()
在这里插入图片描述直接g++ try_catch.cpp报出没有要调用的 hello函数 。
so: :对于但个文件的编译 要g++ -c xxx.cpp

在这里插入图片描述
将2个文件一起 g++ 则不会出错 单个文件 要加 -c
在这里插入图片描述加了-c 输出两个 obj文件 输出后缀为.o
在这里插入图片描述
两个一起编译 并将输出文件命名为project 将会输出一个project.out 文件

在这里插入图片描述
成功输出 Hello
接下来分析背后的原因:
当是单个文件时,try_catch 已经是全部的文件了 即包含main 函数 也没有调用外部函数
直接 g++ try_catch就可以 -o 可以改变输出的文件的名字 若没有-o 直接 g++ hello.cpp try_catch.cpp
默认输出一个 a.out 文件
补充:
在这里插入图片描述摘录与另一篇博主的文章
这个说的与上文介绍的一样,可以单独编译后在整合到一起
也可以一步到位 后缀不一样 代表的操作不一样

/***************************************************************************************************************************/
gcc是linux系统集成的编译器。在linux环境下编辑程序,首先需要克服的便是没有集成开发环境的一键式操作所带来的麻烦。这其中涉及命令行操作、编译选项的设定、文件依赖关系的书写(makefile)等问题。这里主要介绍的是关于gcc的常用命令行参数及其相应的作用。(若编译C++文件,则只需将下列命令的 gcc 换为 g++,源文件的后缀应为 .C/.cpp/.c++/.cc等)
基本格式:gcc [options] file1 file2… //若不加入参数,则按默认参数依次执行编译、汇编和链接操作,生成的可执行文件名为 a.out
常用参数:-E //只执行预处理操作,直接输出到标准输出(可通过 -o 命令指定输出到文件中 ),可配合 -v 命令使用,查看头文件的搜索目录,即使用 -E -v 编译选项
     -S //只执行到编译操作完成,不进行汇编操作,生成的是汇编文件(.s 或 .asm),内容为汇编语言
     -c //执行编译和汇编,但不进行链接,即只生成可重定位目标文件(.o),为二进制文件,不生成完整的可执行文件
     -o filename //将操作后的内容输出到filename指定的文件中
     -static //对于支持动态链接的系统,使用静态链接而不是动态链接进行链接操作
     -g          //编译时生成debug有关的程序信息(供gdb使用)
     --save-temps //生成编译过程的中间结果文件(包括预处理文件(x.ii)、汇编代码(x.s)、目标文件(x.o)和最终的可执行文件)

-IPATH //在PATH指定的目录下寻找相关的include文件,参数中间不加空格
     -lxx //其中xx为指定函数库,对于Linux环境下的函数库,静态库后缀为.a,动态库后缀为.so,一般库名为libxx.a或libxx.so,如加入libm.so库,则使用参数-lm(去除lib和后缀.a\so)
     -LPATH //在PATH指定的目录下寻找相关的库文件,即-lxx指定待链接的库,-L指定寻找该库的路径。不指定时搜索默认的库函数路径。
     -std=xx //指定编译使用的语言标准,如 -std=c++11 使用 c++11 标准
     -x language //指定待编译文件的语言,而不是由编译器根据文件后缀自行判断。即默认情况下gcc根据文件后缀判断使用的编程语言。例如使用文件名 hello 作为源文件名是不合适的,应使用hello.c
     
     -Wall //输出一些简单的错误以及一些可能存在问题的警告
     -Wextra //输出-Wall不包含的警告等
     -Werror //将警告视为错误输出
       -Wl,option          //通过该选项将参数 option 作为后续链接器 ld 使用的参数     -Wl,rpath=/path/to/lib  //为链接器指定一个非默认的运行时库的搜索路径,运行采用了该选项编译的程序时,链接器会在-rpath 指定的目录中搜索所需的 so 库文件,以将其载入内存中   
     -D name=definition //加入宏定义,若不指定def,则默认为1
     -O1、-O2       //规定编译器的优化等级,优化级数越高执行效率一般越好,但是优化会改变原有程序结构,使得其汇编不易理解

//一些进行缓冲区溢出实验时可能需要的选项
     -fstack-protector-fno-stack-protector  //是否开启堆栈保护,这里的保护是在返回地址之前加入一个验证值来确保返回地址不被破坏
     -z execstack                  //启用可执行栈,默认是禁用的
     //(echo 0 >/proc/sys/kernel/randomize_va_space 关闭地址随机化,这是一个单独的命令,操作需要root权限)     //编译动态链接库的选项     -shared -fPIC          //笔者用到的编译动态链接库即 .so 库的选项,其中 -shared 表示生成一个共享目标文件(shared object),-fPIC 表示忽略 PIC(position-independent code)                       //对应的还有个选项 -fpic,其会生成 PIC,详细内容可参见 man gcc
/*****************************************************************************************************************************/
分析编译原理:
http://www.firedragonpzy.com.cn/index.php/archives/2556
http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html
如果有多个c文件,用g++ 命令将会是 非常繁琐的 就出现了Makefile 以及makelists
参考如下网址:
https://www.jianshu.com/p/020f127e06dc
学习Makefile:
http://c.biancheng.net/view/7097.html
https://seisman.github.io/how-to-write-makefile/rules.html
学习makelists(Cmake)
https://www.cnblogs.com/wangshaowei/p/11324100.html
使用CmakeLists :
在这里插入图片描述
#工程名
PROJECT (test)
#设置编译模式 是debug还是release模式
#设置编译模式为Debug模式
set(CMAKE_BUILD_TYPE debug)
IF(NOT CMAKE_BUILD_TYPE) #如果没有设置编译模式 就把编译模式甚至成Debug模式
SET(CMAKE_BUILD_TYPE Release)
ENDIF()
#输出编译模式信息
MESSAGE("-- Build type: " ${CMAKE_BUILD_TYPE})
ADD_EXECUTABLE (test try_catch.cpp)
ADD_EXECUTABLE (test hello.cpp)

在 新建的build文件下 终端输入 cmake … 系统自动到上一级查找CMakeLists.txt 并自动进行 makefile文件
然后进行make 系统按照生成的makefile文件 进行编译 链接
如上图可以看到,两个building 一个Linking
最终Build target test
再次make
也只是Bulid target test
然后 ./test
运行生成的 test文件 即可将结果输出
以上为try_catch.cpp(包含main函数) 与hello.cpp 与hello.h在同一文件夹下
现在不在同一文件夹下在这里插入图片描述
如图所示的目录结构,头文件在inc中 源文件在src中

编写CmakeLists.txt文件

最终的txt文件:
cmake_minimum_required(VERSION 3.16)
#工程名
PROJECT (DXPCTest)
#设定编译后生成的可执行二进制文件所在的目录
#SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#这句话在运行时得在那个目录下重新开中终端
#设定编译后生成的库文件所在的目录
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#并且把该目录设为链接目录
#LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)
#设定头文件所在的目录
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/inc)
#如果希望进入源代码文件夹仍可以继续使用cmake,则需增加文件夹
#ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)

#设置编译模式 是debug还是release模式
#设置编译模式为Debug模式
set(CMAKE_BUILD_TYPE debug)
IF(NOT CMAKE_BUILD_TYPE) #如果没有设置编译模式 就把编译模式甚至成Debug模式
SET(CMAKE_BUILD_TYPE Release)
ENDIF()
#输出编译模式信息
MESSAGE("编译模式: " ${CMAKE_BUILD_TYPE})
MESSAGE("工程路径: " ${PROJECT_SOURCE_DIR})

add_library( hello src/hello.cpp )# 生成一个静态库,会生成一个libhello.a文件

add_library( hello_shared SHARED src/hello.cpp )# 生成一个共享库,会生成一个libhello_shared.so文件

ADD_EXECUTABLE (dxp try_catch.cpp) #这里${PROJECT_NAME} 变量代表工程名 test
target_link_libraries( dxp hello_shared ) #链接生成的
##使用第三方库cmake文件编写
#声明要求的cmake最低版本
cmake_minimum_required(VERSION 2.8)
#声明一个cmake 工程

project (ceres_test)

set(CMAKE_CXX_STANDARD 11)

set( CMAKE_CXX_FLAGS “-std=c++11 -O3”)
#××××××××××××××××××××××使用OPencv第三方库×××××××××××××××××××××××××××××××××××
find_package(OpenCV)
include_directories(${OpenCV})

#××××××××××××××××××××××使用OPencv第三方库×××××××××××××××××××××××××××××××××××

find_package( Ceres REQUIRED)
include_directories( ${CERES_INCLUDE_DIRS})

#添加一个可执行程序
#语法 add_executable (程序名 源代码文件)
add_executable (ceres_test main.cpp)
#××××××××××××××××××××××××××生成的可执行文件链接第三方库OPencv××××××××××××××××××
target_link_libraries(ceres_test ${OpenCV_LIBS})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值