小编bap*_*ste的帖子

无法从gitlab-ci.yml推送

与我的同事一起,我们致力于开发一个每天变得越来越重要的C++库.我们已经通过gitlab-ci.yml文件构建了持续集成实用程序,让我们:

  • 在调试模式下构建和测试
  • 在发布模式下构建和测试
  • 使用Valgrind执行内存泄漏等安全检查,并检查我们的库中是否有任何我们不想要的清晰符号
  • 生成文档

各种让我们选择GitLab的东西!

我们希望对整个库进行概述,并将基准推送到一个单独的项目中.我们已经使用SSH密钥方法完成了类似的文档,但是这次我们想避免这种情况.

我们尝试了这样的脚本:

test_ci_push:
  tags:
    - linux
    - shell
    - light
  stage: profiling
  allow_failure: false
  only:
    - new-benchmark-stage
  script:
    - git clone http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git &> /dev/null
    - cd benchmarks
    - touch test.dat
    - echo "This is a test" > test.dat
    - git config --global user.name "${GITLAB_USER_NAME}"
    - git config --global user.email "${GITLAB_USER_EMAIL}"
    - git add --all
    - git commit -m "GitLab Runner Push"
    - git push http://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.mycompany.home/developers/benchmarks.git HEAD:master
    - cd ..
Run Code Online (Sandbox Code Playgroud)

我们还尝试了一个基本 …

shell gitlab-ci gitlab-ci-runner

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

shell脚本中$ {varname}和$ varname之间的区别是什么

我有一个简单的问题,但我想知道${varname}和之间的区别是$varname什么?

我使用两者,但我没有看到任何差异可以告诉我何时使用其中一个.

unix shell

7
推荐指数
2
解决办法
2939
查看次数

如何部分禁用 cmake C/C++ 自定义编译器检查

我正在尝试使用 cmake 进行一些交叉编译。有些很容易使用互联网上的所有示例,我设法在 Linux(x86 和 ARM)、Windows 和 Android 上交叉编译我的库。但现在我想在自定义平台上进行。

我需要实现的流程:

  1. 获取我的环境(这会破坏所有以前的 bash 经典环境)
  2. 使用cmake编译
  3. 执行我想要的

但 Cmake 正在测试我的自定义 C/C++ 库中的符号,这使得我的库无法编译。我遇到的错误是 cmake 某些版本的 GLIBCXX 和 CXXABI (没有 C 问题),但不是全部。

有没有办法让 cmake 可以接受它?

编辑:

我尝试使用:

set(CMAKE_C_COMPILER_WORKS TRUE)
set(CMAKE_CXX_COMPILER_WORKS TRUE)
Run Code Online (Sandbox Code Playgroud)

与:

include(CMakeForceCompiler)
...
cmake_force_c_compiler(${ENV_PATH}/bin/${CC})
cmake_force_cxx_compiler(${ENV_PATH}/bin/${CXX})
Run Code Online (Sandbox Code Playgroud)

但 cmake 仍在检查符号。

c c++ compilation cmake

4
推荐指数
2
解决办法
8992
查看次数

文件读取缓冲区C和C++之间相同的方法?

我使用Jansson C库来解析一些JSON文件,并使用示例文件中使用的方法,我尝试使用类似C的代码解析它:

FILE *f = fopen(json_path.c_str(), "r");
fseek(f, 0L, SEEK_END);
long size = ftell(f);
fseek(f, 0L, SEEK_SET);
char* data = (char*)malloc((size + 1) * sizeof(char));
long rd = fread((void*)data, 1, size, f);
json_t* root = load_json(data);
Run Code Online (Sandbox Code Playgroud)

虽然这个代码在编译时效果很好gcc,但是如果它是由g++我编译的话就不会,因为它是在C++类中实现的.Jansson库返回的错误与文件结尾字符有关.

那时我尝试实现一个更优雅的C++代码来做到这一点:

std::ifstream f(json_path.c_str());
if (f) {
  std::stringstream s;
  s << f.rdbuf();
  f.close();
  json_t* root = load_json(s.str().c_str());
}
Run Code Online (Sandbox Code Playgroud)

并且该代码永远不会失败,而在我看来两者应该做同样的事情.

我是否在我的C代码中犯了错误,以便在整个缓冲区中读取文件?C++编译如何解释类​​似C的代码,以便文件结束字符可以"消失"?

c c++ jansson

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

如果ptr是静态数组的第一个元素的ptr,编译器将如何评估++ * ptr ++?

评估的顺序是++*ptr++什么?当指针和左值涉及到操作时,它会改变吗?

如果的优先级a++高于*a++a,则将Why ++*a++评估为:首先返回递增的值,然后更改指针,而不是更改指针,然后在该位置递增值。优先权:https//en.cppreference.com/w/cpp/language/operator_precedence

arr = {9, 99, 999 };
int *ptr = arr;
std::cout << ++*ptr++ << '\t';
std::cout << *ptr;

Run Code Online (Sandbox Code Playgroud)

我期望输出为100 100,但实际输出为10 99。

c++ pointers operators

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

为什么我的C项目编译无法找到我的结构?

我有一个基于单个C文件的项目,我尝试重新排列以便在几个.c和.h文件中进一步开发.

我的主要内容如下:

// General includes

typedef struct 
{
} MyStruct;

#include "MyInclude.h"

// Rest of the code
Run Code Online (Sandbox Code Playgroud)

我的文件"MyInclude.c"的结构如下:

#include "MyInclude.h"

// Defines

// Functions that need to know MyStruct
Run Code Online (Sandbox Code Playgroud)

关于海湾合作委员会的编制过程,我有些不明白.事实上,我得到错误"MyStruct未声明(在此函数中首次使用)"并且我不知道为什么我在我的结构的typedef声明之后放入了我的include.

有人知道它为什么会发生吗?

c struct compilation

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

C++矩阵乘法类型检测

在我的C++代码中,我有一个Matrix类,并且编写了一些运算符来乘以它们.我的类是模板化的,这意味着我可以有int,float,double ...矩阵.

我猜运算符过载是经典的

    template <typename T, typename U>
    Matrix<T>& operator*(const Matrix<T>& a, const Matrix<U>& b)
    {
    assert(a.rows() == b.cols() && "You have to multiply a MxN matrix with a NxP one to get a MxP matrix\n");
    Matrix<T> *c = new Matrix<T>(a.rows(), b.cols());
    for (int ci=0 ; ci<c->rows() ; ++ci)
    {
      for (int cj=0 ; cj<c->cols() ; ++cj)
      {
        c->at(ci,cj)=0;
        for (int k=0 ; k<a.cols() ; ++k)
        {
          c->at(ci,cj) += (T)(a.at(ci,k)*b.at(k,cj));
        }
      }
    }
    return *c;
  }
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我返回一个与第一个参数相同类型的矩阵,即Matrix<int> * Matrix<float> …

c++ templates c++03

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