(→Compilação e localização de "expression_type") |
|||
Line 4: | Line 4: | ||
{{TOCright}} | {{TOCright}} | ||
− | == | + | == Problemas Gerais de Compilação == |
'''Q:''' Se tiver uma biblioteca '''libteste.a''' compilada a partir de '''a.h''' e de '''b.h''' e um programa que a usa fazendo #include de '''a.h''' e de '''b.h''', não consigo compilar o programa sem ter os '''.h''' originais?<br> | '''Q:''' Se tiver uma biblioteca '''libteste.a''' compilada a partir de '''a.h''' e de '''b.h''' e um programa que a usa fazendo #include de '''a.h''' e de '''b.h''', não consigo compilar o programa sem ter os '''.h''' originais?<br> | ||
'''R:''' Se o programa cliente usa os nomes '''a.h''' e '''b.h''', então eles têm de existir (mesmo que não sejam os originais). Em geral, a interface ('''.h''') de uma biblioteca é independente do código utilizado na sua produção: podem existir '''.h''' (C/C++) para bibliotecas produzidas a partir de Fortran, por exemplo. Um exemplo concreto é a interface para o standard I/O do C: em C está acessível via '''stdio.h''' e em C++ via '''cstdio'''. | '''R:''' Se o programa cliente usa os nomes '''a.h''' e '''b.h''', então eles têm de existir (mesmo que não sejam os originais). Em geral, a interface ('''.h''') de uma biblioteca é independente do código utilizado na sua produção: podem existir '''.h''' (C/C++) para bibliotecas produzidas a partir de Fortran, por exemplo. Um exemplo concreto é a interface para o standard I/O do C: em C está acessível via '''stdio.h''' e em C++ via '''cstdio'''. | ||
− | |||
− | |||
'''Q:''' Ao executar "make" para construir o projecto, estou a ter o seguinte erro: | '''Q:''' Ao executar "make" para construir o projecto, estou a ter o seguinte erro: | ||
− | /usr/include/cdk/ast/expression_node.h:47:38: fatal error: | + | /usr/include/cdk/ast/expression_node.h:47:38: fatal error: target/expression_type.h: No such file or directory |
compilation terminated. | compilation terminated. | ||
make: *** [zu_parser.tab.o] Error 1 | make: *** [zu_parser.tab.o] Error 1 | ||
Line 20: | Line 18: | ||
(ou seja, a variável tem de ser definida sem qualquer valor) | (ou seja, a variável tem de ser definida sem qualquer valor) | ||
− | == | + | '''Q:''' Estou a compilar o projecto e ocorre o erro: "undefined referente to vtable" na class basic_ast_visitor. Que se está a passar?<br/> |
+ | '''R:''' O erro ocorre no projecto, geralmente na hierarquia dos "visitors", devido a não terem sido definidos todos os métodos declarados nos "visitors". Note-se que não basta declará-los no cabeçalho da classe: é necessário definir os seus corpos, mesmo que sejam vazios. | ||
+ | |||
+ | == Compilação de Programas "Simple" == | ||
+ | |||
+ | O nome do compilador corresponde sempre ao nome da linguagem. O processo envolve três etapas: compilação do código fonte, compilação do código gerado (pelo yasm/nasm) e ligação dos módulos binários no executável final (incluindo a '''librts.a'''). | ||
+ | |||
+ | Assumindo a distribuição do Simple na directoria actual e a directoria "examples" com os programas de teste, as seguintes acções seriam necessárias para compilar o exemplo 1 ('''ex1.spl'''): | ||
+ | |||
+ | ./simple examples/ex1.spl | ||
+ | yasm -felf examples/ex1.asm | ||
+ | ld -o examples/ex1 examples/ex1.o -lrts | ||
+ | |||
+ | Os vários comandos podem diferir nos parâmetros exactos (dependendo do ambiente). Por exemplo, se a '''librts.a''' não estiver numa localização conhecida pelo '''ld''', então é necessário dar o comando da seguinte forma: | ||
+ | |||
+ | ld -o examples/ex1 examples/ex1.o -L$HOME/compiladores/root/usr/lib -lrts | ||
[[category:Projecto de Compiladores]] | [[category:Projecto de Compiladores]] | ||
[[category:Compiladores]] | [[category:Compiladores]] | ||
[[category:Ensino]] | [[category:Ensino]] |
AVISOS - Avaliação em Época Normal |
---|
Esclarecimento de dúvidas:
|
Requisitos para desenvolvimento, material de apoio e actualizações do enunciado (ver informação completa em Projecto de Compiladores):
|
Processo de avaliação (ver informação completa em Avaliação do Projecto):
|
Material de Uso Obrigatório |
---|
As bibliotecas CDK e RTS de apoio ao desenvolvimento do projecto são de uso obrigatório: |
|
A máquina virtual, fornecida para desenvolvimento do projecto, já contém todo o material de apoio. |
Uso Obrigatório: Repositório GIT |
Apenas se consideram para avaliação os projectos existentes no repositório GIT oficial. Apenas se considera para avaliação o ramo main.
Trabalhos não presentes no repositório no final do prazo têm classificação 0 (zero) (não são aceites outras formas de entrega). Não são admitidas justificações para atrasos em sincronizações do repositório. A indisponibilidade temporária do repositório, desde que inferior a 24 horas, não justifica atrasos na submissão de um trabalho. |
Q: Se tiver uma biblioteca libteste.a compilada a partir de a.h e de b.h e um programa que a usa fazendo #include de a.h e de b.h, não consigo compilar o programa sem ter os .h originais?
R: Se o programa cliente usa os nomes a.h e b.h, então eles têm de existir (mesmo que não sejam os originais). Em geral, a interface (.h) de uma biblioteca é independente do código utilizado na sua produção: podem existir .h (C/C++) para bibliotecas produzidas a partir de Fortran, por exemplo. Um exemplo concreto é a interface para o standard I/O do C: em C está acessível via stdio.h e em C++ via cstdio.
Q: Ao executar "make" para construir o projecto, estou a ter o seguinte erro:
/usr/include/cdk/ast/expression_node.h:47:38: fatal error: target/expression_type.h: No such file or directory compilation terminated. make: *** [zu_parser.tab.o] Error 1
Que se passa?
R: O problema ocorre devido ao valor incorrecto de uma variável no ficheiro Makefile do projecto. O valor da variável ROOT deve ser definido como se segue:
ROOT =
(ou seja, a variável tem de ser definida sem qualquer valor)
Q: Estou a compilar o projecto e ocorre o erro: "undefined referente to vtable" na class basic_ast_visitor. Que se está a passar?
R: O erro ocorre no projecto, geralmente na hierarquia dos "visitors", devido a não terem sido definidos todos os métodos declarados nos "visitors". Note-se que não basta declará-los no cabeçalho da classe: é necessário definir os seus corpos, mesmo que sejam vazios.
O nome do compilador corresponde sempre ao nome da linguagem. O processo envolve três etapas: compilação do código fonte, compilação do código gerado (pelo yasm/nasm) e ligação dos módulos binários no executável final (incluindo a librts.a).
Assumindo a distribuição do Simple na directoria actual e a directoria "examples" com os programas de teste, as seguintes acções seriam necessárias para compilar o exemplo 1 (ex1.spl):
./simple examples/ex1.spl yasm -felf examples/ex1.asm ld -o examples/ex1 examples/ex1.o -lrts
Os vários comandos podem diferir nos parâmetros exactos (dependendo do ambiente). Por exemplo, se a librts.a não estiver numa localização conhecida pelo ld, então é necessário dar o comando da seguinte forma:
ld -o examples/ex1 examples/ex1.o -L$HOME/compiladores/root/usr/lib -lrts