Pergunta

Como posso armazenar um número de versão em uma biblioteca estática (file.Â) e mais tarde verificar sua versão em Linux?

P.S. Eu preciso possibilidade de verificar a versão do arquivo a qualquer momento, sem qualquer executável especial usando apenas por utilitários de shell.

Foi útil?

Solução

Talvez você poderia criar uma string com a versão como esta:

char* library_version = { "Version: 1.3.6" };

e para ser capaz de verificá-lo a partir da casca apenas use:

strings library.a | grep Version | cut -d " " -f 2

Outras dicas

Além de fornecer uma corda estática como mencionado por Puppe, é prática comum para fornecer uma macro para recuperar a verificação de versão para compatibilidade. Por exemplo, você poderia ter as seguintes macros (declarado em um arquivo de cabeçalho para ser utilizado com a sua biblioteca):

#define MYLIB_MAJOR_VERSION 1
#define MYLIB_MINOR_VERSION 2
#define MYLIB_REVISION 3
#define MYLIB_VERSION "1.2.3"
#define MYLIB_VERSION_CHECK(maj, min) ((maj==MYLIB_MAJOR_VERSION) && (min<=MYLIB_MINOR_VERSION))

Observe com a macro MYLIB_CHECK_VERSION, eu estou supondo que você quer um grande rev específico e um menor maior rev ou igual a sua versão desejada. Mudança como necessária para a sua aplicação.

Em seguida, usá-lo a partir de um aplicativo chamado, algo como:

if (! MYLIB_VERSION_CHECK(1, 2)) {
    fprintf(stderr, "ERROR: incompatible library version\n");
    exit(-1);
}

Esta abordagem fará com que as informações de versão para vir a partir do arquivo de cabeçalho incluído. Além disso, ele será otimizada em tempo de compilação para o aplicativo de chamada. Com um pouco mais de trabalho, você pode extraí-lo a partir da própria biblioteca. Leia mais ...

Você também pode usar essas informações para criar uma corda estática armazenada dentro de sua biblioteca, como mencionado por Puppe. Coloque algo como isto dentro de sua biblioteca:

struct {
    const char* string;
    const unsigned major;
    const unsigned minor;
    const unsigned revision;
} mylib_version = {
    MYLIB_VERSION, MYLIB_MAJOR_VERSION, MYLIB_MINOR_VERSION, MYLIB_REVISION
};

Isto irá criar uma estrutura chamada mylib_version em sua biblioteca. Você pode usar isso para fazer novas verificações através da criação de funções dentro de sua biblioteca e acessar os de um aplicativo de chamada, etc.

Criação de uma nova resposta com base na sua edição ... Apenas a confusão evitar:)

Se você está procurando uma maneira não-código para resolver o problema, você pode tentar isso. É de (mais uma vez) uma alternativa para a abordagem strings definido por Puppe.

Talvez você poderia apenas tocar um arquivo chamado version_1.2.3 e adicioná-lo ao arquivo. Então, você poderia determinar a versão de olhar para o arquivo versão usando o comando ar:

ar t libmylib.a | grep 'version_' | sed -e 's/^version_//'

Eu não tenho certeza se isso vai te dar o que você precisa, mas não existe um método padrão para a incorporação de metadados como esta em um arquivo. Talvez você encontrará outras informações você deseja armazenar neste "metafile" para o arquivo.

Várias vezes man 1 ident foi mencionado, por isso aqui estão detalhes sobre como usar esse método.

ident é um comando que vem com o RCS (Revision Control System), mas também pode estar disponível se você estiver usando CVS (Concurrent Versions System), ou Subversion.

Você poderia usá-lo como este (clonado a partir da página man):

#include <stdio.h>
static char const rcsid[] =
    "$Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $";
int main() { return printf("%s\n", rcsid) == EOF; }

e f.c é compilado em f.o, em seguida, o comando

ident f.c f.o

saída vontade

   f.c:
       $Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $
   f.o:
       $Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $

Se o seu f.o foram adicionados a um f.a biblioteca estática em seguida, ident f.a deve mostrar uma saída similar. Se você tem vários construído semelhante [a-z].o em sua az.a você deve encontrar todas as suas cordas no arquivo az.a.

ressalva: Só porque eles estão no arquivo .a não significa que será incluído no seu arquivo de programa. A menos que as referências do programa eles o vinculador não vê necessidade de incluí-los. Então, você geralmente tem que ter um método em cada módulo para retornar a corda, e o aplicativo precisa chamar esse método. Existem maneiras de convencer a maioria dos ligadores que é um símbolo necessário sem realmente fazendo referência a ele, mas isso depende do vinculador, e está fora do escopo desta resposta.

Se em vez você está familiarizado com as SCCS (Fonte do sistema de controle de código), então você usaria man 1 what vez, e que seria parecido com este (feito com macros para mostrar a flexibilidade disponível):

#include <stdio.h>
#define VERSION_STR "5.4"
#define CONFIG "EXP"
#define AUTHOR "eggert"
static char const sccsid[] =
    "@(#) " CONFIG " v " VERSION_STR " " __DATE__ " " __TIME__ " " AUTHOR;
int main() { return printf("%s\n", sccsid) == EOF; }

e f.c é compilado em f.o, em seguida, o comando

what f.c f.o

saída vontade

   f.c:
       @(#) EXP v 5.4 1993/11/09 17:40:15 eggert
   f.o:
       @(#) EXP v 5.4 1993/11/09 17:40:15 eggert

PS: tanto ident e what são comandos que vêm com sistemas de controle de origem específicas centralizado. Se você estiver usando um sistema de controle de origem distribuídos (como git) todo o conceito pode não fazer sentido. Para algumas idéias usando git ver este tópico: Mover-se de CVS para git: $ Id: $ equivalente? que o hash não é o mesmo que um número de versão. :)

Se você estiver usando gcc, você pode usar o #ident directiva

#ident "Foo Version 1.2.3.4"
void foo(void){ /* foo code here */ }

Para obter a versão usar apenas uma das seguintes opções:

strings -a foo.o | grep "Foo Version"
strings -a foo.a | grep "Foo Version"
strings -a foo.so | grep "Foo Version"

Isso permitirá que você para compilar a versão para a biblioteca com a capacidade de depois descascando-lo usando strip -R .comment your_file ou completamente omiti-lo, passando -fno-ident (Isso também irá omitir os comentários de versão do compilador dos objetos compilados)

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