std::condition_variable::wait
void wait( std::unique_lock< std::mutex>& lock ); (1) (since C++11)
template< classPredicate >
void wait( std::unique_lock< std::mutex>& lock, Predicate pred ); (2) (since C++11)
以上是condition_variable类的wait函数声明,注意第一个参数必须是std::unique_lock< std::mutex>引用类型,如果是std::lock_guard< std::mutex>就会报错"error: no matching function for call to ‘std::condition_variable::wait(std::lock_guard< std::mutex>&"。
由于LockFreeQueueCpp11类的头文件中#ifndef跟其他文件重复,导致没有包含该头文件,编译的时候报错"error: ‘LockFreeQueueCpp11’ is not a member of ‘audio_alarm’"。
在新的docker的ubuntu容器中编译安装grpc,参考了csdn上的文章<ubuntu18下grpc编译与安装>,然后make的时候一直报错"Unable to checkout",就本地先把boringssl这个工程下载下来后上传到容器中,依然报错。然后参考了csdn上的文章<Git submodule !Unable to checkout !应对办法>解决。文章<ubuntu18下grpc编译与安装>中的make install方法并不支持会报错"Installing via ‘make’ is no longer supported. Use cmake or bazel instead.",然后就去github上参考BUILDING.md文件:“cmake …/… -DgRPC_INSTALL=ON …”,然后再make install即可。
在容器中构建项目时,进入到build目录下执行cmake …后会报错(Could not find a package configuration file provided by “Protobuf” with any of the following names: ProtobufConfig.cmake protobuf-config.cmake),然后对比了下之前的容器,发现会在/usr/local/lib/cmake/protobuf下存在括号中这些文件(protobuf-config.cmake protobuf-config-version.cmake protobuf-module.cmake protobuf-options.cmake protobuf-targets.cmake protobuf-targets-noconfig.cmake),然后将其拷贝到容器中对应目录下就解决问题了。
想调试运行下obs,然后需要安装DirectX,在windows10电脑上先安装directx_Jun2010_redist.exe,发现没有什么用,并没有找到安装在哪里,整个磁盘搜索了也没有找到目标dll在哪里。后来就下载安装DXSDK_Jun10.exe,安装的时候需要先控制面板卸载"Microsoft Visual C++ 2010 x86/x64 redistributable – 10.0.(number over 30319)",然后安装DXSDK_Jun10.exe的时候会把自动安装"Microsoft Visual C++ 2010 x86/x64 redistributable"。
用vs2019来编译obs的时候总时报错说找不到typeinfo.h这个文件,修改成#include 就不再报这个错误。后来又报错说"error C2371: ‘int8_t’ : redefinition;",然后就把#include “pstdint.h"这一行给屏蔽掉,结果又说找不到int8_t的定义,然后#include <stdint.h> 引入该头文件就行了。后面又报错"error LNK2019: 无法解析的外部符号 __iob_func 在libmp3lame-static.lib中使用”,然后就去下载了libmp3lame的工程,根据CMakeLists.txt编译出lib,结果obs报错"error LNK2019: __imp__toupper、_imp__fseek",然后在编译mp3lame的时候,将其属性-c/c+±代码生成-运行库,将其值修改为跟obs一样,就没有问题了。
后面在windows11系统上编译obs的时候报错"fatal error LNK1327: failure during running mt.exe",一开始搜索以为是环境变量的问题,后面参考csdn上的文章<VS2010编译时 mt.exe出错解决方法>,虽然是跟文章上描述的"error MSB6006: “mt.exe”已退出,代码为x"不一致的错误,但是修改"project options, linker, manifest, Generate Manifest-> NO"后编译成功。
在C++中如何前置声明另一个命名空间中的类,即具有命名空间的类如何前置声明:
namespace httplib { //在命名空间内部声明
class Server;
}
如果直接class httplib::Server;会报错"error: ‘httplib’ has not been declared"。
参考了curl\docs\examples目录下的fileupload.c进行post文件,结果总是报错"Mark bundle as not supporting multiuse",后来才发现是目标url地址写错了,后面执行curl_easy_perform又一直报错" Server returned nothing (no headers, no data)",查了下返回的是CURLE_GOT_NOTHING,但是用curl命令是可以上传文件的,然后就抓包对比分析发现并没有看到发送http put包,然后又参考了httpput.c,发现注释" specify target URL, and note that this URL should include a file name, not only a directory"。修改后就可以正常推送文件到服务器了。
在ubuntu上编译vlc的时候,先在windows电脑上clone下载代码,然后上传到Ubuntu平台下,然后参考了根目录下的INSTALL文件,先运行./bootstrap产生configure文件,结果总是报错"autom4te: /usr/bin/m4 failed with exit status: 1"。后来就直接去下载.tar.gz的源码包,然后在ubuntu上解压后再执行就不会报错了。后面想用vs2019来编译调试vlc,结果发现很麻烦,参照github的Build步骤:先在源码目录下的INSTALL文件中找到"installing VLC for Windows from source MUST read",结果"Win32Compile"很复杂,然后去google关键字"vs2019 build vlc"搜索找到"github.com/niozhao/vlc-3.0.11-VS2019",注意readme中"build step",先解压然后编译x64版本,编译报错(FEC2DParityMultiplexor.cpp(169,8): error C2065: “nextPacket”: 未声明的标识符),虽然提示是"nextPacket 未声明",但是双击该提示发现定义的是其他变量;以及(FEC2DParityMultiplexor.cpp(234,35): error C2601: “FEC2DParityMultiplexor::increaseRepairwindow”: 本地函数定义是非法的),然后查找没有发现原因,就把该文件的编码属性从(UTF-8 带签名 - 代码页 65001)修改为(GB2312 - 代码页 936),即跟其他文件的格式保持一致,然后就编译成功了。
编译使用opencv库的应用,总是报错如下:
/usr/bin/ld: manage.o: undefined reference to symbol ‘_ZNK2cv12VideoCapture8isOpenedEv’
//usr/local/lib/libopencv_videoio.so.4.1: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
然后Makefile中加了"-L/usr/local/lib -lopencv_imgcodecs -lopencv_imgproc -lopencv_core"还是报错,然后修改成:
LDFLAGS += pkg-config --libs opencv4
LDFLAGS += -lopencv_videoio -lopencv_highgui -lopencv_imgcodecs -lopencv_core -lopencv_imgproc后成功编译。后来在另一个项目中遇到同样的错误,然后strings后看到是libopencv_videoio.so这个库包含了上面的符号,然后Makefile中添加这个库后也成功编译。
/usr/bin/ld: CMakeFiles/vas.dir/src/imgutils.cpp.o: undefined reference to symbol ‘jpeg_set_quality@@LIBJPEG_8.0’
//usr/lib/x86_64-linux-gnu/libjpeg.so.8: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/vas.dir/build.make:377: recipe for target ‘vas’ failed
make[2]: *** [vas] Error 1
CMakeFiles/Makefile2:76: recipe for target ‘CMakeFiles/vas.dir/all’ failed
make[1]: *** [CMakeFiles/vas.dir/all] Error 2
Makefile:129: recipe for target ‘all’ failed
make: *** [all] Error 2
上面的报错,主要是链接的库不对,应该链接跟头文件对应的libjpeg.so,但是由于CMakeLists.txt中,并没有显示指定libjpeg.so的位置,所以导致链接了默认位置的库,明确指出即可。
后面链接其他基础库so文件时候,总是报错"(.text+0x3948): undefined reference to `cv::imencode(std::string const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator >&, std::vector<int, std::allocator > const&)’",以及在构造opencv的cv::Mat对象中报错"undefined reference to ‘cv::error’" ,后来发现是由于程序的CMakeLists.txt中包含了下面这句:add_compile_options(-D_GLIBCXX_USE_CXX11_ABI=0),直接将这句屏蔽掉后就可以了。
使用ice进行rpc通信,因为历史代码用的是3.6.5版本(/usr/bin/slice2cpp -v,使用该命令可以查看ice的版本号,或者打开生成的.h或者.cpp文件,文件头部注释中包含"// Ice version 3.6.5"),然后就去下载该版本的ice源码,然后参考cpp/test/Ice目录下的例子,一开始想参考echo,但是只有Server.cpp,没有发现Client.cpp,后来就参考该目录下的acm例子工程,然后用slice2cpp可执行命令生成对应的.h何cpp文件后,用g++分别编译Server和Client,然后直接测试运行。参考该例子完成了ice的demo开发验证。后面在容器中,参照博客园<如何在Ubuntu编译ice>编译的ice,没有编译出c++11的库,然后编译工程的时候报错"…/ice/ae.o:(.data.rel.ro+0x280): undefined reference to `IceInternal::Cpp11FnCallbackNC::hasSentCallback() const’",打开ae.cpp发现该函数被ICE_CPP11宏修饰,干脆就在头文件中#undef掉,然后再编译就ok了。
使用default和delete关键字 (default 关键字标记的函数,编译器会自动生成, delete 关键字标记的自动生成函数会被编译器移除) 来对编译器可以自动生成的函数进行标记。要么全部,要么一个都不,这一原则也适用于父类包含虚析构函数的情况。通常这种情况下,我们还应该使用 delete 关键字来移除复制构造函数,避免使用子类对象构造父类对象引发的数据损失。(个人思考:上面说移除复制构造函数,又说要么都有,要么都没有,所以看起来父类包含虚析构的时候编译器自动生成的都要delte掉)。
c++11对{}初始化进行了扩展,让它可以用于任意情况的变量初始化。C++ 自带的容器都可以接收std::initializer_list 作为构造函数的参数,我们可以使用 {} 来对容器进行初始。注意:初始化列表构造函数会被优先匹配;构造函数中的初始化会代替类定义中的初始化;为了避免和构造函数混淆,结合 = 运算符使用 {} 进行初始化。
std::function<void(int)> funcT;
std::thread thread(funcT{},123);
创建线程对象,如果没有加整形参数则会报错"static assertion failed: std::thread arguments must be invocable after conversion to rvalues"。后来搜到说需要添加参数"The initial integer value is missing when thread ctor is called: thread(std::ref(tfunc), 123).Function of thread body takes integer, you need to provide it when thread starts.",添加参数后再次编译就正常了。