es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

bazel ignora los argumentos del compilador utilizando –copt.

Estoy tratando de pasar argumentos del compilador al construir con bazel. Quiero desactivar todas las optimizaciones para que Bazel pueda construir un proyecto simple. De hecho, logré hacer esto sin bazel utilizando la línea de comandos de Windows con este fragmento de código:

Sin bazel:

// main.c

#include <iostream>

class Car{
public:
    Car(){std::cout << "constructor por defecto llamado" << std::endl;}
    Car(Car &&rhs){std::cout << "constructor de movimiento llamado" << std::endl;}
    ~Car(){std::cout << "destructor llamado" << std::endl;}
};

int main() {
    Car a = Car();
    return 0;
}

Ejecutando esto con los argumentos del compilador desde la terminal:

$ g++ main.c -O0 -fno-elide-constructors

Produce la salida deseada:

constructor por defecto llamado
constructor de movimiento llamado
destructor llamado
destructor llamado

Estaba tratando de usar este argumento para bazel y encontré esto: bandera –copt de bazel. Al construir con este comando:

Con bazel:

$ bazel build --copt="-O0" --copt="-fno-elide-constructors" main:main

Recibo la advertencia:

cl : Advertencia de línea de comandod D9002 : ignorando la opción desconocida '-O0'
cl : Advertencia de línea de comandod D9002 : ignorando la opción desconocida '-fno-elide-constructors'

Y cuando lo ejecuto con:

$ bazel-bin/main/main

Obtengo la salida:

constructor por defecto llamado
destructor llamado

Lo que significa que bazel no construyó el proyecto desactivando las optimizaciones. ¿Cómo puedo desactivar todas las optimizaciones al construir mi proyecto con bazel? ¿Estoy cometiendo un error de sintaxis? ¿Cuál podría ser el problema aquí?

Este es mi archivo BUILD en la carpeta principal:

load("@rules_cc//cc:defs.bzl", "cc_binary")
cc_binary(
    name = "main",
    srcs = ["main.cc"],
)

Mi versión de Windows y del compilador en caso de que pueda ayudar:
Microsoft Windows [Versión 10.0.19042.1415]
g++ (x86_64-posix-seh-rev0, construido por el proyecto MinGW-W64) 8.1.0

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para deshabilitar todas las optimizaciones al compilar un proyecto con Bazel utilizando el compilador g++, podemos usar la bandera --cxxopt en lugar de --copt ya que es un compilador de C++.

    Para deshabilitar todas las optimizaciones, podemos pasar la bandera -O0 al compilador.

    Entonces, para construir correctamente el objetivo principal sin optimización usando el compilador g++, se debe usar el siguiente archivo BUILD:

    load("@rules_cc//cc:defs.bzl", "cc_binary")
    
    cc_binary(
        name = "main",
        srcs = ["main.cc"],
        copts = ["-fno-elide-constructors"],
        cxxopts = ["-O0"],
    )
    

    Luego, construye el proyecto ejecutando:

    bazel build main:main
    

    El binario resultante se puede ejecutar usando:

    bazel-bin/main/main
    

Comments are closed.