我正在尝试编写一个makefile,它能够确定何时更改了标头,然后重新编译相应的.cpp文件.为了验证这一点,我创建了三个文件:main.cpp,a.h,和b.h.main.cpp包括a.h和a.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) 我正在开发一个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) 我目前正在开发一个需要使用 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) 我目前正在进行科学模拟(引力体)。我首先使用朴素的单线程算法编写了该代码,并且对于少量粒子而言,该代码的性能令人满意。然后,我对该算法进行了多线程处理(令人尴尬的是,它是并行的),程序花了大约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([¤tIndex, 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) 我目前正在开发一个使用 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) 我试图让柯南通过以下的测试项目工作的葛亭入门指南,这样我就可以开始在实际项目中使用它。我试图在 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'. 为了解决这个问题,我在这里和这里尝试了解决方案。虽然这些不是 …
我目前正在尝试编写一个程序,该程序使用std::binda std::filesystem::path和std::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进行编译,两者都会产生类似的错误.通过搜索引擎搜索没有给出有用的结果.
我期待编写一个程序,需要对进程进行低级别的工作(即使用fork系统调用等).该程序用C++编写,只能在Linux上运行.理想情况下,这将是整个CPU架构(即86,x86_64和ARM)与只不过是重新编译更便携,但我只真正需要x86_64的支持.
由于每个Linux系统调用都需要许多参数并在cpu寄存器中返回许多参数(通常只有1个返回值),因此每个系统调用的C函数包装器很容易实现.另外,因为AFAIK,在内核中实现的系统调用具有相同的参数和返回值,如果是不同的汇编级实现,则可以公开相同的C接口.
这样的事情存在吗?如果是这样,我该如何访问它?
它的文档在哪里(可用函数列表,它们的解释参数以及函数的确切解释)?