C++ 编译指南

错误:找不到xxx.hpp,找不到xxx.lib,“模块计算机类型“x86”与目标计算机类型“x64”冲突”,“模块计算机类型“x64”与目标计算机类型“x86”冲突,Could NOT find 包名(missing: 库名_LIBRARY)等等类似错误

建议使用NuGet或vcpkg安装对应的第三方库。在Visual Studio 中 解决方案->[项目名称]->(右键)->引用->管理NuGet软件包->搜索并安装对应的第三方库。如果要对整个解决方案安装 工具->NuGet包管理器->管理解决方案的NuGet程序包,则可以搜索安装对应版本的第三方库。安装后还要在需要的项目上右键->生成依赖项->生成自定义,勾选对应的第三方库。

具体使用方法参考微软官方文档:NuGet 包管理器用户界面参考

=====================================

有时我们会希望解决方案里的一个项目与其他项目共享NugetPackages以保证它们使用相同版本的第三方库且节约硬盘空间:

在vcxproj和sln文件所在文件夹添加名为packages.config和nuget.config的文件,保证每个项目的packages.config文件内容相同,且nuget.config文件指向的NugetPackages文件夹目录相同(可以使用相对目录)。重启解决方案,在解决方案的对应项目上单击右键->管理Nuget程序包,如果在其中发现了已经安装的第三方库则说明配置成功。

=====================================

错误:“LNK1107 文件无效或损坏: 无法在 0x3E8 处读取”

“属性->配置属性->链接器->输入->附加依赖项” 应配置使用到的静态库文件名,如”opencv_world346d.lib”,而不是动态库”opencv_world346d.dll”

=====================================

错误:找不到xxx.dll

把动态库文件 “opencv_world346d.dll”放在解决方案根目录或编译输出目录下

=====================================

链接时出现错误:LNK2019 无法解析的外部符号 “__declspec(dllimport) bool __cdecl caffe::GPUAvailable(void)” (__imp_?GPUAvailable@caffe@@YA_NXZ),该符号在函数 main 中被引用 main main.obj

在“属性->配置属性->链接器->输入->附加依赖项“中设置必需的静态库.lib文件,注意:如果在Release中设置了文件名中带d的静态库文件(debug静态库),即静态库类型与配置不匹配,即使设置了静态库文件也会出现上述错误

=====================================

错误 LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug

项目属性->c/c++->代码生成->运行库 改为MTd,两个项目改成相同的

=====================================

错误 LNK1123 转换到 COFF 期间失败: 文件无效或损坏

解决方案\属性\配置属性\清单工具\输入和输出\嵌入清单:原来是“是”,改成“否”。

=====================================

错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容

“C/C++” ->“常规”->“调试信息格式”->选择“程序数据库(/Zi)”或“无”,这也会导致Debug无法进入断点

=====================================

未经处理的异常(在 XXX 中): 0xC00000FD: Stack overflow

项目属性->链接器->系统->堆栈保留大小 可以设到160000000

=====================================

C2220: 警告被视为错误 – 没有生成“object”文件

此错误后跟着的警告为导致错误的警告

=====================================

Release的解决方案配置属性和Debug不同,要看清工具栏是Release还是Debug再设置解决方案配置属性。如果一个项目为lib,Release设置为exe,Debug设置为lib,工具栏里忘记改成Debug,则会导致”无法解析的外部符号_main”的错误

=====================================

在windows中使用如下命令生成Visual Studio解决方案文件(.sln)时

cmake .. -G "Visual Studio 15 2017 Win64"

有时会遇到没有设定某个包含目录的错误,如下:

CMake Error at D:/Program Files/CMake/share/cmake-3.14/Modules/FindBoost.cmake:2147 (message):   Unable to find the requested Boost libraries.    Unable to find the Boost header files.  Please set BOOST_ROOT to the root   directory containing Boost or BOOST_INCLUDEDIR to the directory containing   Boost's headers. Call Stack (most recent call first):   cmake/Dependencies.cmake:5 (find_package)   CMakeLists.txt:43 (include)   -- Could NOT find GFlags (missing: GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY) -- Could NOT find Glog (missing: GLOG_INCLUDE_DIR GLOG_LIBRARY) CMake Error at D:/Program Files/CMake/share/cmake-3.14/Modules/FindPackageHandleStandardArgs.cmake:137 (message):   Could NOT find Protobuf (missing: Protobuf_LIBRARIES Protobuf_INCLUDE_DIR) Call Stack (most recent call first):   D:/Program Files/CMake/share/cmake-3.14/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)   D:/Program Files/CMake/share/cmake-3.14/Modules/FindProtobuf.cmake:594 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)   cmake/ProtoBuf.cmake:4 (find_package)   cmake/Dependencies.cmake:24 (include)   CMakeLists.txt:43 (include)   CMake Error: The following variables are used in this project, but they are set to NOTFOUND. Please set them or make sure they are set and tested correctly in the CMake files: Boost_INCLUDE_DIR (ADVANCED)    used as include directory in directory E:/ubuntu/helmet-detection/hardhat-wearing-detection/SSD-RPA    used as include directory in directory E:/ubuntu/helmet-detection/hardhat-wearing-detection/SSD-RPA

查看..文件夹下的CMakeLists.txt发现其中有一些目录变量未设定

这时应该在上述命令前加上设定各个包含目录变量的参数,有如下方法:

cmake .. -G "Visual Studio 15 2017 Win64" -Boost_INCLUDE_DIR=XXX\XXX

如果依然出现问题,那就在错误信息提示的代码前加上

set(BOOST_ROOT "XXX/XXX")

=====================================

error LNK2038: 检测到“_MSC_VER”的不匹配项问题

将所有项目的平台工具集都设置成相同的版本,如都设成v120,清理解决方案并重新生成可以解决此问题

=====================================

Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: 
MaskPooling (known types: AbsVal, ArgMax, BN, BNLL, BatchNorm, Bias, Concat, Convolution, ConvolutionDepthwise, 
Crop, Deconvolution, DetectionOutput, Dropout, ELU, Eltwise, Embed, Exp, Filter, Flatten, InnerProduct, Input, 
LRN, Log, MVN, Normalize, PReLU, PSROIPooling, Parameter, Permute, Pooling, Power, PriorBox, Proposal, ROIPooling, ReLU, 
Reduction, Reshape, SPP, Scale, ShuffleChannel, Sigmoid, Slice, Softmax, Split, TanH, Threshold, Tile)

用编辑器打开caffe.vcxproj,添加

<ClInclude Include="E:\ubuntu\mini-caffe\src\layers\mask_pooling_layer.hpp" />
<CudaCompile Include="E:\ubuntu\mini-caffe\src\layers\mask_pooling_layer.cu" />
<ClCompile Include="E:\ubuntu\mini-caffe\src\layers\mask_pooling_layer.cpp" />

=====================================

LNK2019 无法解析的外部符号 “__declspec(dllimport) public: void __cdecl caffe::Net::Forward(bool)” (__imp_?Forward@Net@caffe@@QEAAX_N@Z),该符号在函数 main 中被引用

这类错误可能是由于上文所述的未设定库导致的,也有可能是由于使用的库与编译器版本不一致导致的,各版本编译器如下表

Visual Studio版本 编译器版本 平台工具集版本

Visual Studio 6 : vc6 V60

Visual Studio 2003 : vc7 V71

Visual Studio 2005 : vc8 V80

Visual Studio 2008 : vc9 V90

Visual Studio 2010 : vc10 V100

Visual Studio 2012 : vc11 V110

Visual Studio 2013 : vc12 V120

Visual Studio 2015 : vc14 V140

Visual Studio 2017 : vc15 V141

    原文作者:柴士童
    原文地址: https://zhuanlan.zhihu.com/p/64838511
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞