小编joh*_*dav的帖子

在同一个Makefile中生成目标之间的递归依赖关系

我正在尝试编写一个makefile,它能够确定何时更改了标头,然后重新编译相应的.cpp文件.为了验证这一点,我创建了三个文件:main.cpp,a.h,和b.h.main.cpp包括a.ha.h包括b.h.

我的makefile看起来像这样:

prog: main.cpp a.h
        g++ main.cpp -o prog

a.h: b.h
Run Code Online (Sandbox Code Playgroud)

当和,和更改的任何组合时a.h,我希望重新编译.尽管如此,只有重新编译时或发生变化,到最后一行似乎被忽略.b.hmain.cppprogproga.hmain.cpp

我做错了什么,如何在不向每个单独的.cpp文件添加完整和完整的标题集的情况下完成我想要的任务(因为对于较大的项目,这可能变得非常麻烦):

prog: main.cpp a.h b.h
        g++ ...
Run Code Online (Sandbox Code Playgroud)

c++ makefile

3
推荐指数
1
解决办法
510
查看次数

NullPointer除了没有明显的原因

我正在开发一个Bukkit插件(错误与bukkit或它的api无关,但我包括了这个事实,我使用它是为了完整性,如果你不知道它是什么/没有听说过你应该仍然能够回答这个问题).我正在处理的插件是一个反聊天垃圾邮件插件.我没有明显的理由得到nullpointerexception.这是一些代码:

public class SpamListener implements Listener{
private HashMap<String, Long> lastMessage;
private HashMap<String, Integer> spamScore;

public void init(){
    lastMessage = new HashMap<String, Long>();
    spamScore = new HashMap<String, Integer>(); 
}

@EventHandler
public void playerChatEvent(AsyncPlayerChatEvent e){
    if(AntiGrief.instance.config.getBoolean("antispam.enabled") && (!e.getPlayer().hasPermission("antigrief.spam.bypass"))){
        Player player = e.getPlayer();
        String name = player.getName();
        int startingScore = spamScore.get(name); // <-- NullPointerException occurs here

        //More spam checking code here

    }
}
Run Code Online (Sandbox Code Playgroud)

JavaPlugin类(主类,对于那些不熟悉bukkit的人):

    spamListener = new SpamListener();
    spamListener.init(); // <-- yes the method is being called, same error occurs if the hashmap …
Run Code Online (Sandbox Code Playgroud)

java nullpointerexception minecraft bukkit

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

为什么 std::bind 在绑定到成员函数时不会编译?

我目前正在开发一个需要使用 std::bind 将参数绑定到成员函数的程序,但是当我尝试这样做时,出现编译器错误。以下是最小示例:

地图.h:

#pragma once

class Map {
    void buildDistances();
    void buildDistances(unsigned islandId);

};
Run Code Online (Sandbox Code Playgroud)

地图.cpp:

#include "Map.h"

#include <functional>

void Map::buildDistances() {
    for(unsigned islandId=0;islandId<24;++islandId){
        auto f = std::bind(&Map::buildDistances, this, islandId);
    f();
    }
}

void Map::buildDistances(unsigned islandId) {}
Run Code Online (Sandbox Code Playgroud)

g++ Map.cpp -c -o map.o在与这两个文件相同的目录中使用该命令进行编译会产生以下错误:

Map.cpp: In member function ‘void Map::buildDistances()’:
Map.cpp:7:64: error: no matching function for call to ‘bind(<unresolved overloaded function type>, Map*, unsigned int&)’
         auto f = std::bind(&Map::buildDistances, this, islandId);
                                                                ^
In file included from Map.cpp:3:
/usr/include/c++/8.1.1/functional:808:5: note: candidate: …
Run Code Online (Sandbox Code Playgroud)

c++ stdbind c++11

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

为什么在CPU上执行线程浮点计算会使它们花费更长的时间?

我目前正在进行科学模拟(引力体)。我首先使用朴素的单线程算法编写了该代码,并且对于少量粒子而言,该代码的性能令人满意。然后,我对该算法进行了多线程处理(令人尴尬的是,它是并行的),程序花了大约3倍的时间。以下是具有相似属性并输出到/ tmp中的文件的琐碎算法的最小,完整,可验证的示例(该示例旨在在Linux上运行,但C ++也是标准的)。请注意,如果您决定运行此代码,它将生成152.62MB的文件。输出数据是为了防止编译器从程序中优化计算。

#include <iostream>
#include <functional>
#include <thread>
#include <vector>
#include <atomic>
#include <random>
#include <fstream>
#include <chrono>

constexpr unsigned ITERATION_COUNT = 2000;
constexpr unsigned NUMBER_COUNT = 10000;

void runThreaded(unsigned count, unsigned batchSize, std::function<void(unsigned)> callback){
    unsigned threadCount = std::thread::hardware_concurrency();
    std::vector<std::thread> threads;
    threads.reserve(threadCount);

    std::atomic<unsigned> currentIndex(0);

    for(unsigned i=0;i<threadCount;++i){
        threads.emplace_back([&currentIndex, batchSize, count, callback]{
            unsigned startAt = currentIndex.fetch_add(batchSize);

            if(startAt >= count){
                return;
            }else{
                for(unsigned i=0;i<count;++i){
                    unsigned index = startAt+i;
                    if(index >= count){
                        return;
                    }
                    callback(index);
                }
            }
        });
    }

    for(std::thread &thread : threads){ …
Run Code Online (Sandbox Code Playgroud)

c++ performance multithreading simd

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

为什么我不能单独创建和初始化 OpenGl VAO?

我目前正在开发一个使用 VAO(每个网格一个)的 OpenGL 3.3 应用程序。当我分别创建和初始化我的 VAO 时,任何对 的调用glDrawElements都会导致程序立即退出而没有任何错误消息。但是,当我一起创建和初始化它们时,完全相同的glDrawElements调用会成功。


单独的初始化代码:

Chunk::Chunk(){
  glGenVertexArrays(1, &m_vaoId);
  glBindVertexArray(m_vaoId);

  glGenBuffers(1, &m_vboId);
  glGenBuffers(1, &m_eboId);

  glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (GLvoid*)(0));
  glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (GLvoid*)(1*sizeof(GLfloat)));
  glEnableVertexAttribArray(0);
  glEnableVertexAttribArray(1);
}
Run Code Online (Sandbox Code Playgroud)


void Chunk::refreshMesh(){
  /*build data into vector<GLfloat> verticies and vector<GLuint> indices...*/

  //send data to GPU
  glBindVertexArray(m_vaoId);

  glBindBuffer(GL_ARRAY_BUFFER, m_vboId);
  glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(GLfloat), vertices.data(), GL_STATIC_DRAW);

  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_eboId);
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size()*sizeof(GLfloat), indices.data(), GL_STATIC_DRAW);
}
Run Code Online (Sandbox Code Playgroud)

编译的初始化代码:

void Chunk::refreshMesh(){
  /*build data into vector<GLfloat> verticies and vector<GLuint> indices...*/

  //send data to GPU
  glGenVertexArrays(1, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl debugging

0
推荐指数
1
解决办法
255
查看次数

如何在 Ubuntu 16.10 上使用 Conan 和 SDL2 解决未定义的引用错误?

我试图让柯南通过以下的测试项目工作的葛亭入门指南,这样我就可以开始在实际项目中使用它。我试图在 Ubuntu 16.10 x64 上用 g++ 编译的 C++ 项目中使用带有 glew 的 SDL2。

我的 conanfile.txt 看起来像这样:

[requires]
SDL2/2.0.5@lasote/stable
glew/2.0.0@coding3d/stable

[generators]
cmake
Run Code Online (Sandbox Code Playgroud)

我的 CMakeLists.txt 文件如下所示:

project(conantest)

cmake_minimum_required(VERSION 3.5)

set(CMAKE_CXX_STANDARD 11)

include(conan/conanbuildinfo.cmake)
conan_basic_setup()

set(SRC_FILES main.cpp Display.cpp)
add_executable(conantest ${SRC_FILES})
Run Code Online (Sandbox Code Playgroud)

我的项目包含一个包含 CMakeLists.txt、conanfile.txt、我所有源代码的目录、一个 Cmake 的构建目录、一个 Conan 的 conan 目录和一个重建.sh。每当我对构建环境进行更改时,我都会使用此重建.sh 脚本来清理和构建项目(rm -r 的,尽管它在工作后不是最佳的,以确保在我尝试时删除先前设置中的任何错误一个修复)。

我的rebuild.sh 看起来像这样:

rm -r ./build/*
rm -r ./conan/*
cd conan
conan install ..
cd ../build
cmake ..
make
Run Code Online (Sandbox Code Playgroud)

当我运行这个脚本时,一切似乎都在工作,直到最终的可执行文件被链接。发生这种情况时,我得到Display.cpp:(.text+0x8a): undefined reference to `SDL_Init'. 为了解决这个问题,我在这里这里尝试了解决方案。虽然这些不是 …

c++ ubuntu conan

0
推荐指数
1
解决办法
1538
查看次数

为什么std :: bind不能使用std :: filesystem :: path和std :: ostream?

我目前正在尝试编写一个程序,该程序使用std::binda std::filesystem::pathstd::ostream,作为引用,如下所示:

#include <functional>
#include <filesystem>
#include <ostream>
#include <iostream>

struct Buggy{
    static void something(const std::filesystem::path &path, std::ostream &out);
    void bind();
};

void Buggy::bind(){
    auto function = std::bind(&Buggy::something, std::placeholders::_1, std::cout);
    function(std::filesystem::path("./"));
}

void Buggy::something(const std::filesystem::path &path, std::ostream &out){
    out << path.string() << std::endl;
}

int main(){
    Buggy buggy;
    buggy.bind();
}
Run Code Online (Sandbox Code Playgroud)

我希望这段代码只输出" ./",但相反,它给了我大量的模板错误.为什么是这样?我对std::bind外观的使用对我来说是正确的.我g++ --std=c++17 bug4.cpp -o bug4 -lstdc++fs在Linux上编译.

我无法读取模板错误,因为它们与此标准库的实现细节混杂在一起.我尝试使用clang和gcc进行编译,两者都会产生类似的错误.通过搜索引擎搜索没有给出有用的结果.

c++ stdbind c++11 c++17

0
推荐指数
1
解决办法
100
查看次数

如何从C/C++应用程序进行Linux系统调用,而不使用汇编,并且以独立于CPU的方式?

我期待编写一个程序,需要对进程进行低级别的工作(即使用fork系统调用等).该程序用C++编写,只能在Linux上运行.理想情况下,这将是整个CPU架构(即86,x86_64和ARM)与只不过是重新编译更便携,但我只真正需要x86_64的支持.

由于每个Linux系统调用都需要许多参数并在cpu寄存器中返回许多参数(通常只有1个返回值),因此每个系统调用的C函数包装器很容易实现.另外,因为AFAIK,在内核中实现的系统调用具有相同的参数和返回值,如果是不同的汇编级实现,则可以公开相同的C接口.

这样的事情存在吗?如果是这样,我该如何访问它?

它的文档在哪里(可用函数列表,它们的解释参数以及函数的确切解释)?

c c++ linux assembly system-calls

0
推荐指数
1
解决办法
785
查看次数