Compilando código de apue


12

Agora mesmo, comecei a ler o livro: Programação Avançada no Ambiente UNIX® . Eu queria tentar executar seu primeiro exemplo de código. Estou executando o Scientific Linux 6.4.

Eu baixei o código-fonte e, como ele diz no README, corri makeno arquivo descompactado.

Eu escrevi o primeiro programa (um lscomando simulado )

#include "./include/apue.h"
#include <dirent.h>

int
main(int argc, char *argv[])
{
    DIR           *dp;
    struct dirent *dirp;

    if(argc!=2)
        err_quit("usage: test directory_name");

    if((dp=opendir(argv[1]))==NULL)
        err_sys("Can't open %s", argv[1]);

    while((dirp=readdir(dp))!=NULL)
        printf("%s\n", dirp->d_name);

    closedir(dp);
    return 0;
}

e coloque-o no arquivo descompactado. Como o livro tinha aconselhado Então eu corri: gcc myls.c. Mas eu recebo este erro:

# gcc myls.c
/tmp/ccWTWS2I.o: In function `main':
test.c:(.text+0x20): undefined reference to `err_quit'
test.c:(.text+0x5b): undefined reference to `err_sys'
collect2: ld returned 1 exit status

Eu queria saber como posso resolver esse problema. Também quero executar um código que escrevo em qualquer diretório.


De onde você espera err_{quit,sys}vir?
Chris Baixo

No código fonte não compactado, há um diretório:, includeque possui o arquivo de cabeçalho apue.h. Mas este é o único arquivo nesse diretório. Eu não entendo onde estão as definições de funções reais! Pensei que alguém estivesse familiarizado com a estrutura de arquivos de código-fonte deste livro aqui.
makhlaghi

Os .harquivos incluem os protótipos para as funções. Suas implementações estão .soou .aarquivos que precisam estar presentes na caixa. Estas são bibliotecas dinâmicas e estáticas que contêm as funções.
slm

O que é mesmo apue.h?
vozes

Respostas:


13

Uma breve revisão de como escrever e compilar os programas em Programação Avançada no Ambiente UNIX® , graças à slm por me ajudar a entender as etapas. Você pode baixar o código fonte aqui . Eu gostaria que essa informação fosse incluída como parte do apêndice b do livro, onde o arquivo de cabeçalho é explicado.

O arquivo descompactado contém diretórios com os nomes dos capítulos e mais dois com o nome includee lib. Aqueles com os nomes dos capítulos possuem todos os programas desse capítulo.

O includediretório contém o arquivo de cabeçalho que é usado na maioria dos programas no livro: apue.h. O libdiretório possui o código fonte das implementações para esse cabeçalho.

Vamos supor que o arquivo não compactado esteja localizado em:, SCADDRESS/por exemplo, pode ser: /home/yourid/Downloads/apue.3e/

Depois de descompactar o código fonte, entre no diretório e execute make:

$ cd SCADDRESS
$ make

makeirá compilar todos os programas em todos os capítulos. Mas o importante é que, antes disso, criará a biblioteca que conterá as implementações das funções no apue.h.

Para compilar um programa de exemplo que você escreve do livro, execute este comando do GCC (supondo que o nome do seu programa myls.cseja o primeiro do livro):

gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue

-Iinforma gccqual diretório procurar o arquivo de inclusão. -Linforma o local do diretório da biblioteca e -lapueindica o nome do arquivo da biblioteca nesse diretório. Assim, -LXXX significa procurar um arquivo no diretório da biblioteca com o nome: libXXX.a ou libXXX.so.


Às vezes, pode ser esclarecedor adicionar -Wallao gcccomando para torná-lo avisado com mais frequência.
precisa saber é o seguinte

3

Eu acho que este Q&A do stackoverflow intitulado: Onde está definida a função err_sys ()? tem o que você precisa. 2 das respostas nesse tópico tinham o seguinte a dizer:

A1

err_sys () é uma função usada em vários livros escritos por W. Richard Stevens. Esta função é usada para imprimir que tipo de erro ocorreu.

A função é usada em programas nos textos com um arquivo de cabeçalho personalizado "ourhdr.h" (ou qualquer outra coisa). Verifique o apêndice para a lista de cabeçalhos ou a definição de função.

A2

A fonte desta função (da Programação avançada no ambiente UNIX®, de W. Richard Stevens) pode ser encontrada no site do livro: http://www.apuebook.com/ .

Referências


Obrigado, mas meu problema é como compilá-lo, para que esses erros não surjam. Este err_sysé apenas um exemplo, existem outras funções nesse arquivo de cabeçalho. Portanto, estou procurando uma resposta genérica para esse problema (como incluir o arquivo de cabeçalho e compilá-lo com êxito), não reescrevendo essa função específica.
makhlaghi

1
@makhlaghi - os erros são b / c, você está perdendo as implementações subjacentes. Você geralmente inclui estes argumentos gccusando as -Lreferências às bibliotecas a serem usadas. As bibliotecas são os arquivos .soou .a. Este tutorial pode ser útil para se familiarizar com w / gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html . Especificamente esta seção: "Pesquisando arquivos e bibliotecas de cabeçalho (-I, -L e -l)"
slm

Muito obrigado pela sua paciência em lidar comigo (sendo inexperiente!). Eu entendi como compilá-lo. Eu tenho que usar este comando: gcc -o myls myls.c -L LIBPOSITION -lapue. Onde LIBPOSITION está no libdiretório do diretório não compactado. Obrigado novamente.
makhlaghi

@makhlaghi - não mencione isso. Eu gosto de ajudar os outros a entender como as coisas funcionam. Acredite ou não, ter que explicar as coisas me ajuda a entender melhor as coisas. Obrigado pela Q e boa sorte com sua jornada no gcc!
slm

2

Os seguintes passos funcionaram para mim (Ubuntu 14.04 64bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzFaça o download do arquivo tar compactado no site oficial do livro
  2. tar xzf src.3e.tar.gzIsso cria a pasta descompactada chamada apue.3eno diretório atual por padrão
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev. Isto é para o link -lbsd em / threads
  5. make Isso compilará automaticamente todo o código-fonte em todas as pastas
  6. cd introdepois ./ls1 ..funciona como esperado (lista os arquivos do diretório pai)

Talvez você precise procurar outros trechos de código do livro, mas deve ser simples.


1

O que makhlighi explicou em seu último comentário funcionou para mim, mas eu tive que usar um código-fonte diferente, não o do site oficial www.apuebook.com.

O que eu usei pode ser encontrado em https://github.com/roktas/apue2e . Como alguém explicou, este foi implementado para funcionar com o sistema Linux moderno.


Talvez você possa elaborar isso um pouco?
slm

0

Criei a biblioteca com sucesso usando a instrução de linha de comando fornecida aqui. Eu tive dificuldades para criar uma amostra no Xcode. Para isso, defini os caminhos de pesquisa dos arquivos de cabeçalho e das bibliotecas (painel "Configurações de compilação"). Então, eu defini a própria biblioteca no painel "Construir fases" do que "Vincular binário com bibliotecas". Depois disso, é uma brisa.


0

Se o apue.3e estiver instalado, você pode tentar colocar o apue no diretório padrão do os, ex:

code@lab:~/src/code$ sudo cp ../apue.3e/include/apue.h /usr/include/
code@lab:~/src/code$ sudo cp ../apue.3e/lib/libapue.a /usr/lib/

Quando o código for compilado, adicione o argumento: -lapue

code@lab:~/src/code$ gcc -o myls myls.c -lapue
code@lab:~/src/code$ ./myls
Usage: ls <dir>

0

'err_sys' e 'err_quit' estão presentes em um arquivo chamado 'errno.c' que não está no seu diretório de trabalho atual. Primeiro, abra a pasta 'apue' que você baixou e descompactou e copie todos os itens dessa pasta, por exemplo, advio, daemons etc., tudo para o seu diretório de trabalho atual. Agora, na pasta 'include', você encontrará o arquivo de cabeçalho apue.Copie isso também para o diretório de trabalho atual.Em suma, qualquer arquivo .c que você usará em seu programa deve no diretório de trabalho atual. Copie todos esses arquivos para o diretório de trabalho atual.

Agora, para resolver o problema. O arquivo errno.c está na pasta lib na pasta apue. Copie-o para o diretório de trabalho atual. Isso resolverá o problema.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.