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.

Author: tod, 2016-12-15

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.

 7
Author: HolyBlackCat, 2016-12-15 14:42:55

A seguir estão os passos para compilar a aplicação C/C++ estaticamente com a biblioteca FreeImage no Ubuntu:

  1. Use Este link para obter a distribuição de origem do FreeImage.
  2. transferir e descomprimir para obter o directório de origem do FreeImage.
  3. dentro desta pasta, abre o ficheiro README.linux e lê-o. Tem informações muito úteis. Eu recomendaria que não faltasse.
  4. 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.
 6
Author: tod, 2016-12-19 11:45:17

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.

  1. falha na ligação estática da FreeImage 3.15.4 à MingW (resolvido)
  2. https://github.com/KelSolaar/FreeImage/blob/master/README.minGW
 4
Author: Angelica, 2017-05-23 12:33:51

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.

 1
Author: grovkin, 2016-12-25 00:10:38
Tem uma dependência de uma biblioteca zip. Provavelmente zlib.

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.

Https://github.com/MalcolmMcLean/babyxrc

 -1
Author: Malcolm McLean, 2016-12-15 12:06:48