Compilando código de apue

10

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 fiz o download do código-fonte e, como está escrito no README, executei make no arquivo descompactado.

Eu escrevi o primeiro programa (um comando simulado ls )

#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 aconselhou, 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 corrigir esse problema. Eu também quero ser capaz de executar um código que escrevo em qualquer diretório, alguém pode me orientar sobre isso também?

    
por makhlaghi 17.12.2013 / 04:23

7 respostas

11

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

O arquivo não compactado contém diretórios com os nomes dos capítulos e outros dois chamados include e lib . Aqueles com os nomes dos capítulos têm todo o programas desse capítulo neles.

O diretório include contém o arquivo de cabeçalho que é usado na maioria dos programas do livro: apue.h . O diretório lib tem o código-fonte do implementações para o cabeçalho.

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

Depois de descompactar o código-fonte, vá para o diretório e execute make :

$ cd SCADDRESS
$ make

make irá compilar todos os programas em todos os capítulos. Mas o importante é que antes disso, vai fazer a biblioteca que conterá as implementações do funções em apue.h .

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

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

-I informa ao gcc qual diretório procurar pelo arquivo de inclusão. -L informa a localização do diretório da biblioteca e -lapue , informa o nome do arquivo da biblioteca para procurar nesse diretório. Tal que -LXXX significa procurar por um arquivo no diretório da biblioteca com o nome: libXXX.a ou libXXX.so.

    
por 17.12.2013 / 06:20
3

Eu acho que esse stackoverflow Q & A intitulado: Onde a função err_sys () é definida? tem o que você precisa. 2 das respostas nesse tópico diziam:

A1

err_sys() is a function used in several books written by W. Richard Stevens. This function is used to print what type of error occurred.

The function is used in programs in the texts with a custom header file "ourhdr.h" (or something else). Check the appendix for the header listing or the function definition.

A2

The source for this function (from Advanced Programming in the UNIX® Environment, by W. Richard Stevens) can be found on the book's website: http://www.apuebook.com/.

Referências

por 17.12.2013 / 04:54
2

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

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

Você pode precisar encontrar outros trechos de código no livro, mas deve ser simples.

    
por 14.01.2016 / 06:45
1

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

O que eu usei pode ser encontrado no link . Como alguém explicou, este foi implementado para trabalhar com o moderno sistema Linux.

    
por 08.04.2014 / 01:45
0

Eu construí a biblioteca com sucesso usando a instrução de linha de comando dada aqui. Eu tive dificuldades para construir uma amostra no Xcode. Para fazê-lo, defini os caminhos de pesquisa para os arquivos de cabeçalhos e as bibliotecas (painel "Build Settings"). Do que eu defini a biblioteca em si no painel "Build Phases" do que "Link Binary With Libraries". Depois disso, é uma brisa.

    
por 25.09.2015 / 09:48
0

Se o apue.3e estiver instalado, você pode tentar colocar o apue no diretório padrão, 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 é compilado, adicione o argumento: -lapue

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

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

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

    
por 23.08.2017 / 19:18

Tags