2021.07.13学习总结

cmake(cmake_demo)(cmake_test)

(cmake . 后面的点不要漏了!!!!!!)

常用的预定义变量

PROJECT_SOURCE_DIR 工程的根目录

PROJECT_BINARY_DIR 运行cmake的目录,通常是${PROJECT_SOURCE_DIR}/build

ADD_EXECUTEABLE(cmake目录 源文件的集合 )经常搭配AUX_SOURCE_DIRECTORY使用

AUX_SOURCE_DIRECTORY搜寻目录下所有源文件的文件

ADD_SUBDIRECTORY()增加子文件夹--之后会进入子文件夹纪念性CMAKELIST的执行

CMAKE_MINIMUM_REQUIRED() 很多时候还是要申明最低版本,不然会报错啊

LIBRARY_OUTPUT_PATH 动态库生成路径

ADD_LIBRARY 设置静动态库

具体用法:

SHARED,动态库
STATIC,静态库
MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})

一般我们使用的静态库/动态库只是后缀名不同而已,上面构建的libhello.so与libhello_static.a,显然名字不同哦。这时你会有一个想法,那我把hello_static改成hello,结果是不可行的,静态库无法构建。重名会忽略第二条指令。

解决方法:改libhello_static.a的属性–输出名字SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
这样就可以生成libhello.so与libhello.a了

关于动态库的版本号

#VERSION 指代动态库版本,SOVERSION 指代 API 版本。
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
AUX_SOURCE_DIRECTORY(. DIR_SRCS)

目录结构

.
├── bin
├── build
├── CMakeLists.txt
└── src
    ├── CMakeLists.txt
    ├── main.cpp
    ├── model1
    │   ├── CMakeLists.txt
    │   ├── model1.cpp
    │   └── model1.h
    ├── model2
    │   ├── CMakeLists.txt
    │   ├── model2.cpp
    │   └── model2.h
    └── model3
        ├── CMakeLists.txt
        ├── model3.cpp
        └── model3.h
cd cmakeTest && cd build
cmake ..
make
./../bin/cmakeTest

怎样区分debug、release版本

>>建立debug/release两目录,分别在其中执行cmake -DCMAKE_BUILD_TYPE=Debug(或Release),需要编译不同版本时进入不同目录执行make即可;

Debug版会使用参数-g;Release版使用-O3 –DNDEBUG

>> 另一种设置方法——例如DEBUG版设置编译参数DDEBUG

IF(DEBUG_mode)

add_definitions(-DDEBUG)

ENDIF()

在执行cmake时增加参数即可,例如cmake -D DEBUG_mode=ON

${} 表示取值 IF中可以直接使用变量名

$ENV{} 环境变量取值

环境赋值 SET(ENV{变量名} 值)

文档查询

cmake_demo

里面的README中很多详细的操作,

不小心改了环境路径

重新定义PATH

export PATH=/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

为所有用户添加环境变量

vim etc/profile

在结尾添加

export PATH="路径名/:$PATH"

source etc/profile

配置ssh(这个虽然做了很多次,但是一直没有总结)

  • 首先是查看有没有安装ssh

    dpkg -l | grep ssh
    
  • 一般是没有,然后安装

    sudo apt-get install openssh-server
    
  • 再次查看安装的服务

  • 如果没有则可以这样启动:

    sudo /etc/init.d/ssh start
    
  • 修改 /etc/ssh/sshd_config(低版本)

    sudo gedit /etc/ssh/sshd_config
    

    PermitRootLogin without-password用#注释

    加上PermitRootLogin yes

  • 高版本直接

    sudo service ssh stop  #关闭服务:
    sudo service ssh restart  #重启服务
    
  • sudo service ssh restart重启服务就行了

  • 这里推荐使用MobaXterm远程连接,这个工具功能很多,唯一不好的就是复制有点caodan

今天牛客网刷题错题总结

  1. c++中使用protected、private修饰的构造不能再类外利用构造对象;(这里单例模式就用到了这个思想,周末有空整理一下c++的各种模式)

  2. vector中的resize函数是系统分配内存大小,如果是reserve只是定义这个容器最大可以是多大,不是分配内存,就等于说家长说这个月你最多能用多少钱,但是他不一定给你这么多,如果不够用,他之后还会再给。而resize就是直接这个月给你那么多钱。

  3. typeid(变量名).name()获取类型,这个操作符返回的c-type的字符串类型,所以如果嵌套的话返回的应该是char const *

    #include<iostream>  
    #include <typeinfo>  
    using namespace std;  
    
    class Class1{};
    class Class2:public Class1{};
    void fn0();
    int fn1(int n);
    
    int main(void)  
    {  
        int a = 10;
        int* b = &a;
        float c;
        double d;
    
        cout << typeid(a).name() << endl;
        cout << typeid(b).name() << endl;
        cout << typeid(c).name() << endl;
        cout << typeid(d).name() << endl;
        cout << typeid(Class1).name() << endl;
        cout << typeid(Class2).name() << endl;
        cout << typeid(fn0).name() << endl;
        cout << typeid(fn1).name() << endl;
        cout << typeid(typeid(a).name()).name() << endl;
        system("pause");
    }  
    

    结果

    int
    int *
    float
    double
    class Class1
    class Class2
    void __cdecl(void)
    int __cdecl(int)
    char const *
    
  4. 局部变量可以和全局变量重名

    int a = 10;
    int main()
    {
        int a = 9;
        cout << a << endl; //输出a等于9
        cout << ::a << endl;  //输出a等于10
        return 0;
    }
    
  5. C++中的拷贝构造函数在下面哪些情况下会被调用

    • 使用一个对象要去构造另一个对象

      MyClass myclass1;
      MyClass myclass2(myclass1);
      
    • 调用函数形参是对象的时候(这里是c分配在栈函数内存是自动拷贝对象)

    • 函数返回类对象的时候

  6. 编译型语言:在程序运行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序时,就不用再进行翻译了。(C,C++等,需要经过编译(compile)、链接(linker)这两个步骤)

    解释型语言:是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(JavaScript、Python、Erlang、PHP、Perl、Ruby)

  7. 表达式不能赋值

原文地址:https://www.cnblogs.com/sunnylinry/p/15008831.html