me
me copied to clipboard
学习 C++ (Part 1)
Hello, World
env: MacOS, Clang++, vscode project: hello
hello/src/main.cpp
#include <iostream>
using namespace std;
int main() {
cout << "Hello, world!";
return 0;
}
hello/Makefile
CC := clang++
SRC_DIR := src
OBJ_DIR := obj
BIN_DIR := build
EXE := $(BIN_DIR)/app
SRC := $(wildcard $(SRC_DIR)/*.cpp)
OBJ := $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
CCFLAG := -std=c++11 -arch x86_64
# CCFLAG := -std=c++11 -arch arm64
CPPFLAGS := -Iinclude
CFLAGS := -Wall
LDFLAGS := -Llib
LDLIBS := -lm
.PHONY: all clean
all: $(EXE)
$(EXE): $(OBJ) | $(BIN_DIR)
$(CC) $(CCFLAG) $(LDFLAGS) $^ $(LDLIBS) -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp | $(OBJ_DIR)
$(CC) $(CCFLAG) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
$(BIN_DIR) $(OBJ_DIR):
mkdir -p $@
run:
./build/app
clean:
@$(RM) -rv $(BIN_DIR) $(OBJ_DIR)
# -include $(OBJ:.o=.d)
Compile & Run
➜ hello make clean && make && make run
build/app
build
mkdir -p build
clang++ -std=c++11 -arch x86_64 -Llib src/main.cpp -lm -o build/app
./build/app
Hello, world!%
OpenCV
再次回顾一下OpenCV
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
VideoCapture cap(0);
if(!cap.isOpened()) {
cout << "Cannot open camera\n";
return 1;
}
Mat frame;
while(true) {
bool ret = cap.read(frame);
if(!ret) {
cout << "failed" << endl;
break;
}
imshow("live", frame);
if (waitKey(1) == 'q') {
break;
}
}
return 0;
}
将Mat保存为jpg
bool save(Mat frame) {
bool ret = true;
string fn = string_format("./imgs/%d.jpg", time(0));
cout << fn << endl;
vector<uchar> buff; // buffer for coding
vector<int> param(2);
param[0] = IMWRITE_JPEG_QUALITY;
param[1] = 80; // default(95) 0-100
imencode(".jpg", frame, buff, param);
ofstream fout(fn, ios::out | ios::binary);
fout.write((char*)&buff[0], buff.size());
fout.close();
return ret;
}
原本我们在编译时需要clang++ -std=c++11 -arch arm64 -I/opt/homebrew/Cellar/opencv/4.5.4_3/include/opencv4 -L/opt/homebrew/Cellar/opencv/4.5.4_3/lib -o app main.cpp -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_video -lopencv_videoio
这时你可以借助pkg-config来简化,pkg-config会在PKG_CONFIG_PATH中去找pc文件,brew install的时候会自动配置这个,所以只需要pkg-config --cflags --libs opencv4
就ok, 但这里一定要注意很多网上的文章会比较旧,如果你是用的v4,则需要pkg-config --cflags opencv4
, 这个就对应/opt/homebrew/opt/opencv/lib/pkgconfig/opencv4.pc
所以,简单修改刚才的Makefile
CCFLAG := -std=c++11 -arch arm64
CPPFLAGS := -Iinclude `pkg-config --cflags opencv4`
LDFLAGS := -Llib `pkg-config --libs opencv4`
opencv包括很多图片,视频,包括rtsp等的基本操作
Xcode
vscode调试还是有些麻烦,所以也交叉对比一下Xcode,折腾了半天,
- 要对引用的所有dylib签名 (几个月以前还不需要)
- 因为需要有摄像头权限,但是CommandLine缺少Info.plist,所以需要手动在build phase中添加Copy,其原理就是在可执行程序的相同目录下复制一个Info.plist,但是Debugging依然有问题,改为App形式
扩展阅读: