Tentando usar/incluir/compilar a biblioteca de terceiros, libmagic. Detecção de arquivo C/C ++

StackOverflow https://stackoverflow.com/questions/2105816

  •  21-09-2019
  •  | 
  •  

Pergunta

Depois de procurar uma maneira de detectar o FileType de um fluxo de arquivos, descobri que o Unix Comando de arquivo Usa a libmagic e estou tentando usar a biblioteca, mas não consigo fazer funcionar. Eu raramente integrava o código de terceiros por conta própria, então essa é provavelmente uma grande parte do meu problema também.

Por que:

Estou fazendo isso porque tenho um aplicativo de visualização de imagem GUI portátil que precisará detectar tipos de arquivos de arquivo (rar, zip, mais?) Do nome do arquivo e, em seguida, os tipos de arquivo de imagem dentro. Espero poder usar libmagic para Windows e Linux (e Mac); portanto, se esse não for o caso, pare -me agora, porque precisarei encontrar outra coisa.

Tentar:

eu encontrei alguém fazendo algo semelhante, mas não posso seguir o que eles estão fazendo, e não tenho idéia de como compilar/executar nada para começar a mexer.

Meu primeiro instinto foi fazer algo como:

// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above)
#include <stdio.h>
#include "magic.h"
int main() {
  magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
  magic_load(myt,NULL);
  printf("magic output: '%s'\n",magic_file(myt,__FILE__));
  magic_close(myt);

  return 0;
}

Em seguida, compile com algo como:

$ gcc magic.c -o magic.o
$ g++ fileTypeTest.cpp -o fileTypeTest magic.o

Qual (obviamente?) Não funciona. Eu nem sei por onde começar a procurar, quais perguntas fazer ou se essa é a direção certa para resolver meu problema original em primeiro lugar.


Edit: agora eu tenho

#include    <stdio.h>
#include    <magic.h>

int main(int argc, char* argv[]) {
  if (argc != 2) {
    printf("bad arguments");
    return 0;
  }
  magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
  magic_load(myt,NULL);
  printf("magic output: '%s'\n", magic_file(myt, argv[1]));
  magic_close(myt);

  return 0;
}

compilando com:

$ g++ -L/usr/lib -libmagic fileTypeTest.cpp -o fileTypeTest

funciona. Eu tive que ir para sináptico e instalar o libmagic-dev. Vou ter que testar para ver se consigo copiar /usr/lib/libmagic.a no meu diretório de origem ao compilar meu aplicativo no mingw do Windows, mas isso será para outra pergunta mais tarde, suponho.

Foi útil?

Solução

__FILE__ é uma macro reservada de símbolo de pré-processamento usado para fins de depuração/log. Considere isso como um exemplo:

// This file is called test.c
char *p = NULL;
if (!(p = malloc((1 * sizeof(char) + 1)))){
   printf("Error in file: %s @ line %d\n\tMalloc failed\n", __FILE__, __LINE__);
   exit(-1);
}

Se a chamada para malloc Falha, você verá a saída no exemplo acima como este:

Error in file: test.c @ line 23
       Malloc failed

Observe como o código capta o código -fonte original. O exemplo acima ilustra o uso disso.

Eu acho que seu código deve ser algo assim:

// fileTypeTest.cpp, placed in file-5.03/src/ (source from link above)
#include <stdio.h>
#include "magic.h"
int main(int argc, char **argv) {
  if (argc > 1){
     magic_t myt = magic_open(MAGIC_CONTINUE|MAGIC_ERROR/*|MAGIC_DEBUG*/|MAGIC_MIME);
     magic_load(myt,NULL);
     printf("magic output: '%s'\n",magic_file(myt,argv[1]));
     magic_close(myt);
  }
  return 0;
}

O código acima verifica se existe um parâmetro que é passado para este programa e o parâmetro seria um nome de arquivo, ou seja, argv[0] aponta para o nome executável (o binário compilado), argv[1] aponta para a matriz de chars (uma string) indicando o nome do arquivo em questão.

Para compilar:

g ++ -i/usr/incluir -l/usr/lib/libmagic.so filetesttype.cpp -o filetesttype
g++ -L/usr/lib -lmagic fileTestType.cpp -o fileTestType

Editar: Obrigado Alok por apontar o erro aqui ...

Se você não tiver certeza de onde residem o libmagic, procure -o no/usr/local/lib e/usr/local/inclua - isso depende da sua instalação.

Veja isso para encontrar as macros predefinidas aqui.

Espero que isso ajude, cumprimentos, Tom.

Outras dicas

Onde é magic.h no sistema de arquivos? O pré -processador está encontrando -o? Se não, use -I<path>.

Não sei por que você acha que o acima "obviamente" não funciona. Ver Como misturar C e C ++ no FAQ C ++ para detalhes.

Parece magic.h tem adequado extern "C" { } gabinetes. Então, compilando seu código com g++ deve funcionar bem. Você pode #include <magic.h> na tua .cpp Arquive e use todas as funções libmagic.

  • Existe um erro específico que você está recebendo?
  • Não verifiquei o uso das funções libmágicas.
  • Você precisa se vincular ao libmagic. Sua g++ necessidades de comando -lmagic.
  • Desde magic.h é mais provável em um local padrão, você deve usar #include <magic.h>.

Diga -nos qual é o seu erro para obter ajuda mais específica.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top