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{变量名} 值)
文档查询
里面的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
今天牛客网刷题错题总结
-
c++中使用protected、private修饰的构造不能再类外利用构造对象;(这里单例模式就用到了这个思想,周末有空整理一下c++的各种模式)
-
vector中的resize函数是系统分配内存大小,如果是reserve只是定义这个容器最大可以是多大,不是分配内存,就等于说家长说这个月你最多能用多少钱,但是他不一定给你这么多,如果不够用,他之后还会再给。而resize就是直接这个月给你那么多钱。
-
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 *
-
局部变量可以和全局变量重名
int a = 10; int main() { int a = 9; cout << a << endl; //输出a等于9 cout << ::a << endl; //输出a等于10 return 0; }
-
C++中的拷贝构造函数在下面哪些情况下会被调用
-
使用一个对象要去构造另一个对象
MyClass myclass1; MyClass myclass2(myclass1);
-
调用函数形参是对象的时候(这里是c分配在栈函数内存是自动拷贝对象)
-
函数返回类对象的时候
-
-
编译型语言:在程序运行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序时,就不用再进行翻译了。(C,C++等,需要经过编译(compile)、链接(linker)这两个步骤)
解释型语言:是在运行的时候将程序翻译成机器语言,所以运行速度相对于编译型语言要慢。有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(JavaScript、Python、Erlang、PHP、Perl、Ruby)
-
表达式不能赋值