• 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. 表达式不能赋值

  • 相关阅读:
    如何制作URL文件
    对象映射工具AutoMapper介绍
    C#高阶函数介绍
    System.Web.Caching.Cache
    系统架构设计:进程缓存和缓存服务,如何抉择?
    System.Web.Caching.Cache类 缓存 各种缓存依赖
    max server memory (MB)最大服务器内存配置--缓解内存压力
    第0节:.Net版基于WebSocket的聊天室样例
    第六节:Core SignalR中的重连机制和心跳监测机制详解
    第五节:SignalR完结篇之依赖注入和分布式部署
  • 原文地址:https://www.cnblogs.com/sunnylinry/p/15008831.html
Copyright © 2020-2023  润新知