[已解决] windows 编译 C 报错 error mutex in namespace std does not name a type

Windows 下 编译C/C++ 程序报错:error: ‘mutex’ in namespace ‘std’ does not name a type 怎么解决,换MinGW

问题

编译C++程序时,报错:

error: 'mutex' in namespace 'std' does not name a type

解决否

以解决

方案

这个是 Windows 安装的 MinGW 多线程选择问题,这里需要的是posix版本,而不是win32的多线程方案。

在使用 mingw x64 install 程序时,选择

install

参考

  • https://www.jianshu.com/p/c3411fe5b19c
  • https://stackoverflow.com/questions/14191566/c-mutex-in-namespace-std-does-not-name-a-type

C++ ProtoBuf 安装并使用

步骤

  1. 下载ProtoBuf源文件
  2. 准备编译环境
  3. 编译并配置环境变量
  4. ProtoBuf Demo编码

下载

github ProtoBuf,这里选择cpp版本。

编译安装ProtoBuf

编译安装


./configure --disable-shared x86_64-apple-darwin17.7.0 --prefix=/Users/paulxu/Jumei/compose/PicsToPdf/gcc/protobuf-build/ ## make clean # optional make -j2 # 双倍编译 make install

配置环境

export PKG_CONFIG_PATH="/Users/paulxu/Jumei/compose/PicsToPdf/gcc/protobuf-3.7.1"

ProtoBuf C++ Demo编码

编译

g++ `pkg-config --cflags --libs protobuf`    -std=c++11 -v ./lm.helloworld.pb.cc ./proto_test1.cpp  -o proto_test1.o

使用

编写一个模版

syntax = "proto3";

package Demo;

message Files {
    repeated File file = 1;
}

message File {
    string fileName = 1;
    uint32 fileSize = 2;
    string ext = 3;
    bytes data = 4;
}

编译模版

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto

常见问题

  1. Please use ‘syntax = “proto2”;’ or ‘syntax = “proto3”;’ to specify a syntax version.

方案:这个是*.proto文件语法问题,如果你下载ProtoBuf3.*版本,为了和ProtoBuf2.*区别开来,就会有这样的提示,要求你在第一行加上提示信息就行了。

  1. 编译Demo过程中有很多语法检查报错。

方案:新版本ProtoBuf基于C++11,使用了新特性以及语法,所以在编译测试代码时,需要加上-std=c++11 就行了。

  1. undefined reference to `google::protobuf::Message::SerializeToOstream(std::ostream*) const’

方案:这个是包include路径配置不完整,需要完善。

  1. mac ld: symbol(s) not found for architecture x86_64

方案:编译时,需要把 *.pb.c 就是模版文件生成的目标文件带上。

Mac环境,安装OpenCV,VScode断点调试C++程序

Mac环境下,配置OpenCV的C/C++环境,并且能够通过VSCode断点调试。

背景

最近在研究图像识别相关代码——OpenCV,为了便于调试,就要在Mac上搭建一个调试c++程序的调试环境。我这跑通了,分享给大家。

环境

  • Mac OS 10.14.5
  • xcode-select v2354
  • Visual Studio code 1.35.1
  • OpenCV 3.4.5
  • Clang 1001.0.46.4
  • CMake 3.14.5

步骤说明

  1. 编译环境准备
  2. 安装OpenCV
  3. 安装VScode 插件
  4. VScode 项目配置
  5. OpenCV HelloWorld

环境准备

Mac 自带有C/C++环境,就不再赘述。

Xcode Command Line Tools是必须的,可通过一下命令行触发安装程序,或者下载安装。

命令安装 xcode-select
 sudo xcode-select --install
下载 xcode-select 安装

Apple Developer Download

选择下载文件注意这里提示的版本号!
命令行安装速度很慢,且失败率很高,建议通过下载dmg文件安装

CMake 准备

编译OpenCV时要用到cmake。同样可以通过homebrew或者下载安装。
下载方式安装的CMake,cmake可执行程序在/Applications/CMake.app/Contents/bin/cmake.

如果你用的homebrew方式安装opencv那么CMake就不是必须的.

pkg-config 安装

编译引用有opencv库的c/c++代码需要附带很多参数来告知include path,libs等,用pkg-config就能精简编译参数。

brew install pkg-config

安装OpenCV

有两种方式安装。

brew install
## 一个命令安装好opencv3
brew install opencv3

安装好之后最好配置上这几个环境变量。(一般命令行会提示你)

export PATH="/usr/local/opt/opencv@3/bin:$PATH"

export LDFLAGS="-L/usr/local/opt/opencv@3/lib"
export CPPFLAGS="-I/usr/local/opt/opencv@3/include"

export PKG_CONFIG_PATH="/usr/local/opt/opencv@3/lib/pkgconfig"

用homebrew安装很方便,就是安装时间很长(我用了一个大白天)。额外还会安装python-opencv。

编译安装

点击下载源代码。这里我选择的是Sources 3.4.5

解压后,进入目录

cd <opencv 解压后目录>
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local 
make
sudo make install

这里创建的release目录会放cmake命令产生的成果。CMAKE_INSTALL_PREFIX配置的目录会存make命令产生的成果。

到这里如果都没报错就算安装成功了。

一般都不会出问题,在虚拟环境不一定能成功。

参考自 编译安装opencv

写个C++ Hello World

先写一个只引用了标准库的C++代码试试看。

“`C++
/// ./main.cpp
#include <stdio.h>
#include

int main(int argc, const char * argv[]) {
std::cout << “Hello, World!\n”;
return 0;
}


结果如下。 ![](http://cdn.itjsz.com/20200710162408.png) 没问题就继续尝试在代码引入`OpenCV`库。 #### pkg-config 环境配置 安装好后,配置一个环境变量就行了。 ```sh PKG_CONFIG_PATH="~/opencv解压目录/release/unix-install"

配置好之后在执行命令:

pkg-config opencv --libs --cflags opencv

显示内容大致如下,这块的内容就是opencv.pc里面的配置。

该环境变量就是为了让pkg-config能够找到opencv.pc这个文件。

写个OpenCV Demo

好,重点来了,大部分人会卡在这里

写个OpenCV HellowWorld来试试,打开一个空的VScode项目,创建
文件test.cpp

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

using namespace std;
using namespace cv;

Mat src, dst, src_gray;

char* window_name = "Demo";

/**
 * @主函数
 */
int main( int argc, char** argv )
{

    /// 读取一副图片,不改变图片本身的颜色类型(该读取方式为DOS运行模式)
    src = imread(argv[1], 1 );

    /// 将图片转换成灰度图片
    cvtColor(src, src_gray, CV_RGB2GRAY);

    namedWindow(window_name, CV_WINDOW_AUTOSIZE);

    imshow(window_name, src_gray);

    while(true) {
        int c;
        c = waitKey(20);
        if (27 == (char) c) {
            break;
        }
    }
}

进入到命令行环境

## 编译测试程序
g++ `pkg-config opencv --libs --cflags opencv` ./test.cpp -o ./test.o
## 运行测试程序
./test.o ~/Downloads/opencv-logo.png

pkg-config 这条命令是为编译opencv测试代码引入类库。

能看到如下运行结果,恭喜你成功了。

可参考该链接最后: 编译自测程序

实际调试代码不停编译运行会敲很多命令,我们尝试把这些工作交给VScode。先为VScode安装一些插件

  • C/C++
  • C++ Intellisense
  • C++ Clang Command Adapter

在根目录下创建一个.vocode文件夹,再创建三个文件。

  • .vscode/launch.json
  • .vscode/tasks.json
  • .vscode/c_cpp_properties.json

文件.vscode/tasks.json

{
    "tasks": [
        {
            "type": "shell",
            "label": "g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.o",
                "`pkg-config",
                "--libs",
                "--cflags",
                "opencv`"
            ],
            "options": {
                "cwd": "/usr/bin"
            },
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": []
        }
    ],
    "version": "2.0.0"
}

文件.vscode/launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.o",
            "args": [
                "~/Downloads/opencv-logo.png"
            ],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment":  [
                {"name": "PKG_CONFIG_PATH", "value": "opencv解压目录/release/unix-install"},   // 这是opencv解压码后创建的release目录下的unix-install, 要保证该目录下下有opencv.pc文件
                {"name": "DYLD_LIBRARY_PATH", "value": "/usr/local/opencv/build/lib"}   // 这个是你在编译时,opencv make时`CMAKE_INSTALL_PREFIX`指定的目录
                // {"DYLD_LIBRARY_PATH": "/usr/local/opencv/build/lib"}    // 这样的配置是错误的!
            ],
            "externalConsole": true,         // 这个开关打开表示,新开一个命令行窗口并运行程序。
            "MIMode": "lldb",
            "preLaunchTask": "g++ build active file"         // 这一行的内容要和上一个文件`.vscode/tasks.json`的`tasks`->`label`字段的内容要一模一样!
        }
    ]
}

文件.vscode/c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "/usr/local/include",
                "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include",
                "/usr/local/opencv/include",        // 这个是你在编译时,opencv make时`CMAKE_INSTALL_PREFIX`指定的目录
                "${workspaceFolder}"
            ],
            "browse": {
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": "",
                "path": [
                    "/usr/local/include",
                    "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include",
                    "/usr/local/opencv/include",     // 这个是你在编译时,opencv make时`CMAKE_INSTALL_PREFIX`指定的目录
                    "${workspaceFolder}"
                ]
            },
            "intelliSenseMode": "clang-x64",
            "macFrameworkPath": [
                "/System/Library/Frameworks",
                "/Library/Frameworks"
            ],
            "compilerPath": "/usr/bin/g++",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

点击VScode菜单栏Debug > Start Debugging运行结果如下:

为了便于调试,我把launch.jsonexternalConsole设置为true,这样会在vscode之外新开一个终端运行程序,可能会弹框要授权,同意即可。

常见问题

  1. pkg-config 配置不正确导致的报错
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
test.cpp:1:10: fatal error: 'opencv2/imgproc/imgproc.hpp' file not found
#include "opencv2/imgproc/imgproc.hpp"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
[Finished in 0.4s with exit code 1]

解决方案:

运行一下命令添加一条path

export PKG_CONFIG_PATH="/opencv解压目录/release/unix-install":"$PKG_CONFIG_PATH"
  1. dyld 包依赖问题
dyld: Library not loaded: @rpath/libopencv_dnn.3.4.dylib
  Referenced from: ~/App/test
  Reason: image not found
bash: line 1: 18912 Abort trap: 6           ~/App/test
[Finished in 1.0s with exit code 134]

解决方案:

if you want to solve error on terminal you can use export DYLD_LIBRARY_PATH=your/lib:$DYLD_LIBRARY_PATH if you want to solve error on Xcode in build page , go to "Runpath Search Paths" add you lib path

运行一下命令添加一条path

export DYLD_LIBRARY_PATH=/usr/include/opencv/build/lib:$DYLD_LIBRARY_PATH

遇到问题,欢迎留言

原文链接。不支持转载!