me icon indicating copy to clipboard operation
me copied to clipboard

学习 C++ (Part 1)

Open nonocast opened this issue 2 years ago • 0 comments

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,折腾了半天,

  1. 要对引用的所有dylib签名 (几个月以前还不需要)
  2. 因为需要有摄像头权限,但是CommandLine缺少Info.plist,所以需要手动在build phase中添加Copy,其原理就是在可执行程序的相同目录下复制一个Info.plist,但是Debugging依然有问题,改为App形式

扩展阅读:

nonocast avatar Apr 16 '22 12:04 nonocast