小编Jon*_*man的帖子

如何使用Clang和LibTooling的标准库

我想使用Clang和LibTooling来创建一些C++源代码分析和转换工具.我按照教程构建了Clang和LibTooling ,并且我已经能够使用我构建的Clang二进制文件运行并创建一些分析工具并编译C++程序.但是,如果我包含标准库中的标头(在源文件或我的工具中),则在编译或运行源文件/工具时会遇到问题.例如,如果我对以下C++源文件运行clang-check:

#include <iostream>

int main() {
  std::cout << "Hello";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到"致命错误:找不到'iostream'文件".(注意:我可以编译C++程序,例如那些使用用户定义类的程序,而不是使用标准库的C++程序.)为了解决这个问题,我构建了libc ++(遵循指南,在llvm/project中构建它)我构建LLVM和Clang的目录,但是我仍然无法使用Clang和使用libc ++的工具.现在,如果我尝试使用以下方法编译测试文件:

export CPLUS_INCLUDE_PATH="~/clang-llvm/llvm/projects/libcxx/include"
export LD_LIBRARY_PATH="~/clang-llvm/llvm/projects/libcxx/lib"
~/clang-llvm/llvm/build/bin/clang++ ~/Documents/main.cpp
Run Code Online (Sandbox Code Playgroud)

然后我得到"致命错误:'找不到'unistd.h'文件".所以我的问题是:我如何正确地指出Clang和我的工具使用libc ++?

我正在运行OS X Yosemite 10.10并使用Clang 3.6.0.

c++ macos clang libc++ libtooling

14
推荐指数
1
解决办法
2452
查看次数

在Win10上使用VS2015编译的C++ SDL2程序中调试加载时错误

我正在使用Visual Studio 2015在64位Windows 10上使用SDL2编写C++项目.我最近购买了一台新的Windows 10笔记本电脑并从github克隆了我的项目.我的项目编译正确,但运行时出现以下错误:

应用程序无法正确启动(0xc000007b).单击"确定"关闭应用程序.

根据我目前的研究,这个错误通常是由加载不兼容的DLL引起的,例如64位版本而不是32位版本.到目前为止我发现的建议包括:

  • 检查我是否使用32位版本的SDL2 DLL
  • 安装/重新安装Visual Studio 2015的Visual C++ Redistributable的x86版本
  • 使用Dependency Walker来解决哪个DLL失败的问题

我的项目设置为Win32构建,我确保我使用的是我明确链接的所有DLL的32位版本(libfreetype-6,libpng16-16,SDL2,SDL2_image,SDL2_mixer和SDL2_ttf) .我已确认x86 VC++ Redistributable已安装在我的机器上.

最后,我尝试使用Dependency Walker来确定可能导致问题的DLL(虽然我已经读到了Dependency Walker有很多误报的警告).这些是结果:

Dependency Walker静态分析 Dependency Walker静态分析

Dependency Walker分析结果 Dependency Walker分析结果

在那之后,探查器冻结并且永远不会继续.请注意,SDL组件和VC运行时正在加载而没有错误.

该程序在我的两台旧机器上正确编译和加载,一台运行32位Windows 7,一台运行64位Windows 10.

现在是实际问题.我可以采取哪些其他步骤来调试此崩溃?或者有人从我提供的信息中看到我做错了什么?

相关问题:

编辑:

正如rflobao建议的那样,我在32位exe上使用了64位版本的Dependency Walker.以下是我的分析运行的新输出:

新的Dependency Walker配置文件输出

此时,和以前一样,Dependency Walker冻结了.我仍然完全迷失了,并且不觉得我更接近能够确定导致问题的原因.

c++ dll sdl-2 windows-10 visual-studio-2015

10
推荐指数
2
解决办法
737
查看次数

在游戏世界中存储和检索对已卸载对象的引用

我正在制作一个开放世界的单人RPG,其中世界主要由孤立区域组成,其可扩展性分为几个部分.世界包含彼此相互作用的生物.大多数生物都会提到其他生物,可能包括其他地区的生物.being类似于可能的类定义

class Being {
    weak_ptr<Being> target;
    // other members
};
Run Code Online (Sandbox Code Playgroud)

当然,我需要能够在磁盘上保存和加载游戏状态.现在,我不想让所有生物一直装满.我只想加载那些靠近玩家的生物,或者最坏的情况是加载当前加载区域内的所有生物.实现这一目标的好策略是什么?以下是我到目前为止所提出的一些想法.

  1. 在磁盘上,beings将为每个引用的存储器存储唯一标识符.当A被加载时,如果已经加载了B,则只需设置指针.如果B已卸载,则还必须加载.缺点是这可能会递归加载许多可能无法直接使用的生物.
  2. 它们不包含包含实际指针的生物,而是包含标识符.然后,当使用引用的生物时(例如,如果一个物体需要损坏另一个目标),它们将仅在需要时加载.这使得使用引用变得复杂,并且可能导致更多的保存/加载操作,但它避免了加载不必要的数据.

这些选择有更好的替代方案吗?我想这是一个常见问题,但我无法在SO上找到相关问题.

c++ oop storage caching reference

5
推荐指数
1
解决办法
114
查看次数