Como criar uma biblioteca estática com g ++?

101

Alguém pode me dizer como criar uma biblioteca estática de um arquivo .cpp e .hpp? Preciso criar o .o e o .a? Também gostaria de saber como posso compilar uma biblioteca estática e usá-la em outro código .cpp. Sim header.cpp, header.hpp .gostaria de criar header.a. Teste o header.a em test.cpp. Estou usando o g ++ para compilar.

linuxx
fonte
3
Você pode aceitar a resposta de @NeilButterworth (ou outra)?
einpoklum

Respostas:

110

Crie um arquivo .o:

g++ -c header.cpp

adicione este arquivo a uma biblioteca, criando uma biblioteca se necessário:

ar rvs header.a header.o

usar biblioteca:

g++ main.cpp header.a

fonte
3
g ++ test.cpp header.a -o test, não?
linuxx de
11
@unapersson: Por quê? O executável não está no a.outformato, então isso é altamente enganoso. E por que você "nunca" deveria criar um executável chamado test?
Lightness Races in Orbit
5
@Tomalak Geret'kal: Acho que isso tem a ver com o fato de testser um comando do sistema. Mas desde programas de teste geralmente nunca são instalados no diretório bin sistema e exigem que você escrever ./testnão é o problema mais uma para mim também ...
ereOn
10
@unapersson: Não. Estou dizendo exatamente o que disse. Os executáveis ​​não são mais produzidos no a.outformato, mas o nome permanece por motivos de legado. (E se você for incapaz de usar um shell corretamente, então isso é problema seu;. Eu, pelo menos sabe como executar um executável do diretório atual testé muito bem para um nome do arquivo executável, desde que você está escrevendo apenas um teste rápido trecho de curso.)
Lightness Races in Orbit
4
Nomear um executável testé algo do qual aprendi da maneira mais difícil a me arrepender e sou "perfeitamente capaz de usar um shell". É uma má ideia, e eu a vi morder muitos outros que são "perfeitamente capazes de usar uma concha".
Presidente James K. Polk
46

Você pode criar um .aarquivo usando o arutilitário, assim:

ar crf lib/libHeader.a header.o

libé um diretório que contém todas as suas bibliotecas. é uma boa prática organizar seu código dessa maneira e separar o código e os arquivos de objeto. Ter tudo em um diretório geralmente parece feio. A linha acima é criada libHeader.ano diretório lib. Então, em seu diretório atual, faça:

mkdir lib

Em seguida, execute o arcomando acima .

Ao vincular todas as bibliotecas, você pode fazer desta forma:

g++ test.o -L./lib -lHeader -o test  

O -Lsinalizador irá g++adicionar o lib/diretório ao caminho. Desta forma, g++sabe qual diretório procurar ao procurar libHeader. -llibHeadersinaliza a biblioteca específica a ser vinculada.

onde test.o é criado assim:

g++ -c test.cpp -o test.o 
Sriram
fonte
2
e o que é lib / libHeader.a? ar rcs ... não é melhor do que ar crf?
linuxx de
1
@linuxx: main.o será o arquivo objeto que você criará em main.cc
Sriram
@linuxx: os sinalizadores exatos que você usa com o utilitário ar são sua decisão com base em seus requisitos. Consultar as páginas de manual de ar seria uma boa ideia.
Sriram
como testar a biblioteca usando test.cpp?
linuxx de
19
Não seria em -lHeadervez de -llibHeader?
Dolanor
30

Alguém pode me dizer como criar uma biblioteca estática de um arquivo .cpp e .hpp? Preciso criar o .o e o .a?

Sim.

Crie o .o (conforme normal):

g++ -c header.cpp

Crie o arquivo :

ar rvs header.a header.o

Teste :

g++ test.cpp header.a -o executable_name

Observe que parece um pouco sem sentido fazer um arquivo com apenas um módulo nele. Você poderia facilmente ter escrito:

g++ test.cpp header.cpp -o executable_name

Ainda assim, vou lhe dar o benefício da dúvida de que seu caso de uso real é um pouco mais complexo, com mais módulos.

Espero que isto ajude!

Lightness Races in Orbit
fonte
1
Como incluímos vários módulos?
Sidhin S Thomas
2
Um bom! Às vezes vemos o ranlibque no GNU significa simplesmente ar s.
Viet