Como compilar a aplicação C/C++ de forma estática com a Biblioteca FreeImage no Linux (Ubuntu)?
estou a seguir Este exemplo. No entanto, eu quero compilar uma binária estática para o código de exemplo de brinquedo dado. Normalmente, eu uso -static
durante a compilação, mas aqui ele dá uma mensagem de erro.
o comando de compilação que funciona bem:
g++ freeimagetest.cpp -o freeimagetest -lfreeimageplus
o comando de compilação que Não funciona bem:
g++ freeimagetest.cpp -o freeimagetest -lfreeimageplus -static
as últimas linhas da mensagem de erro:
In function `ZIPPreDecode':
(.text+0x6f8): undefined reference to `inflateReset'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libfreeimageplus.a(tif_zip.o): In function `ZIPSetupDecode':
(.text+0x783): undefined reference to `inflateInit_'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libfreeimageplus.a(tif_zip.o): In function `ZIPSetupDecode':
(.text+0x7b4): undefined reference to `deflateEnd'
collect2: ld returned 1 exit status
Então, como é que isto pode ser feito/arranjado?
editar: Eu poderia não vejo como o link anexo resolve o meu problema. Aparentemente, parece que, devido às mensagens de erro, no entanto, há algum problema na forma como estou tentando compilá-lo estaticamente. Não consegui encontrar a maneira certa de o fazer. Eu acho que a mensagem de erro é Miss leading - apenas termina com estas linhas (onde estas linhas são menos de um por cento de toda a mensagem). Quem o fez pode responder melhor. Se acha que a sua resposta é mais do que uma suposição educada, peço-lhe por favor, tente antes de responder. Só levará alguns minutos Se você seguir o link anexo. Além disso, eu etiquetei C
também porque é o mesmo para programas de linguagem C também.
5 answers
Normalmente, quando você tem uma ligação estática a uma biblioteca (em vez de ligá-la dinamicamente), você precisa também ligar todas as suas dependências manualmente. Você precisa descobrir que Biblioteca (dependência) falta e ligá-lo também.
Uma pesquisa rápida mostra que inflateReset
é de uma biblioteca chamada zlib
. Assim, você precisa ligá-lo usando -lz
. Há uma boa chance de você já ter esta biblioteca em seus diretórios de pesquisa de compiladores, mas se você não tiver, então você precisa compilar manualmente.
A seguir estão os passos para compilar a aplicação C/C++ estaticamente com a biblioteca FreeImage no Ubuntu:
- Use Este link para obter a distribuição de origem do FreeImage.
- transferir e descomprimir para obter o directório de origem do FreeImage.
- dentro desta pasta, abre o ficheiro
README.linux
e lê-o. Tem informações muito úteis. Eu recomendaria que não faltasse. -
README.linux
o ficheiro também guia como compilar (estático e dinâmico) e instale esta biblioteca para C ou C++. O que se segue é sobre C++:
Construir FreeImagePlus
O FreeImagePlus é um invólucro C++ para o FreeImage. Para criar o FreeImage como uma biblioteca de c++, introduza a pasta de FreeImage com a linha de comandos e compile a distribuição com o seguinte comando:
make -f Makefile.fip
Compilar O Teste App Estaticamente
Assim que make
estiver completo, os ficheiros desejados estão disponíveis dentro da pasta Dist
.
- libfreeimageplus.a : isto é a biblioteca estática pronta a usar.
- FreeImagePlus.h : Este é o ficheiro de cabeçalho disponível para inclusão.
Basta copiar estes dois ficheiros para a pasta onde o exemplo ficheiro c++ (digamos freeimagetest.cpp) já está colocado.
Use o seguinte comando para compilar a aplicação C/C++ de forma estática com a biblioteca FreeImage no Ubuntu:
g++ -static freeimagetest.cpp -L. -lfreeimageplus -o freeimagetest
Se quiser saber mais sobre a criação e utilização de bibliotecas estáticas, pode seguir-se um exemplo Aqui.
Estes passos resolveram o meu problema. Por favor, sinta-se à vontade para melhorar esta resposta.Usado C++ 6 Visual Fonte: Usar o FreeImage como biblioteca estática
Como usar o FreeImage como uma biblioteca estática em vez de como uma DLL (Visual C++ 6) ?
1. Compile the FreeImage library in debug and release modes and close your projects. You won't need to use the FreeImage source code anymore.
Note: Do not compile the FreeImage DLL (project named FreeImage) but the project named FreeImageLib. This should produce a huge file named FreeImage.lib (in release mode) or FreeImaged.lib (in debug mode) in the Dist\ directory.
2. Copy FreeImage.lib/FreeImaged.lib into your lib\ directory or in a directory where the linker can find them (e.g. your project directory). You can use "Menu->Tools->Options->Directories->Library files" for this.
3. Create a new project and add your code in it.
Add a call to FreeImage_Initialise() at the beginning of you main function and a call to FreeImage_DeInitialise() at the end of this function.
4. Edit the compiler options (Menu -> Project -> Settings)
1. tab C/C++ : Category "Preprocessor"
* Add FREEIMAGE_LIB to the preprocessor definitions
2. tab C/C++ : Category "Code Generation"
* Use the Multithreaded run-time library (in release mode)
* Use the Debug Multithreaded run-time library (in debug mode)
5. Edit linker options (Menu -> Project -> Settings)
1. tab Link : Category Input
* Add FreeImage.lib to the list of object/library modules (release mode)
* Add FreeImaged.lib to the list of object/library modules (debug mode)
2. tab Link : Category Input
* Add LIBCMT to the Ignore library list (it helps to avoid a warning)
6. Compile and link your program.
Usando MakeFile.MingW
# Uncomment this variable to make a static library. This may
# also be specified as an environment variable and can hold
# any of STATIC and SHARED and must be in uppercase letters.
# Default: SHARED
#FREEIMAGE_LIBRARY_TYPE = STATIC
FREEIMAGE_LIBRARY_TYPE = STATIC
Não precisas de mais nenhuma libary referme ReadMe.Secção 2 Da Mingw
2. Construir a biblioteca de FreeImage com o MinGW
Você não precisa de ter qualquer outra biblioteca de terceiros (como libjpeg, libpng, libtim, libmng e zlib e outros) instalado em seu sistema para compilar e usar a biblioteca. Utilizações de FreeImage suas próprias versões dessas bibliotecas. Assim, podes ter a certeza que O FreeImage irá sempre usar as versões mais recentes e devidamente testadas das bibliotecas de terceiros.
O link que você postou em sua própria resposta a esta pergunta tem o seguinte no topo:
Fonte de distribuição inclui código-fonte para FreeImage, C++, C#, Delphi e VB6 wrappers, exemplos e usado internamente bibliotecas LibTIFF, LibJPEG, LibPNG, ZLib, OpenEXR, OpenJPEG, 'LibRaw', LibJXR e LibWebP.
A distribuição que está a usar provavelmente não compila todas estas bibliotecas na versão estática de a biblioteca de freeimage.
Os erros de compilação sugerem que você deve tentar adicionar o zlib do sistema e talvez o Libtim à lista de bibliotecas contra as quais você liga. Desta forma você pode evitar ter que construir sua própria versão da biblioteca freeimage e usar a versão do sistema. Se o ZLib e o LibTIFF não forem os que faltam, você pode tentar adicionar as versões do sistema das outras bibliotecas nessa lista, um a um, para ver qual resolverá a questão do link em falta.
Estas funções não têm dependências e são uma maneira melhor de ir se quiser evitar o inferno de dependência.