Problema ao compilar com Makefile [RESOLVIDO]

1. Problema ao compilar com Makefile [RESOLVIDO]

Jonathan Sansalone
JSansalone

(usa CentOS)

Enviado em 03/05/2013 - 09:26h

Olá pessoal!

Estou desenvolvendo um aplicativo em c++ que se comunica com impressoras fiscais e estou tendo muitas dificuldades para fazer funcionar no linux.

Eu tenho duas bibliotecas libconvecf.so e libswmfd.so e elas vão ter que ficar em um diretório ./rt/lib/i386, só que eu não estou conseguindo executar o programa e elas não podem ficar em /usr/lib.

Pergunta: Como eu posso fazer para compilar e executar o meu programa mantendo estas duas bibliotecas em ./rt/lib/i386?

meu Makefile está assim:

swmfd := $(wildcard *.0)
all:
ifeq ($(strip $(swmfd)),)
@echo "Vai gerar link simbolo SWMFD"
@ln -s rt/lib/i386/libswmfd.so
@ln -s rt/lib/i386/libconvecf.so
endif
@echo "[Building...] -> swedamfd"
# @$(CXX) -O00 -g -Wall -o exemplo exemplo.cpp -lconvecf -lpthread -ldl
@$(CXX) -O00 -g -w -o swedamfd -L./rt/lib/i386 swedamfd.cpp -lconvecf -lpthread -ldl

Ele compila sem erros deste jeito, só não executa. Diz "error while loading shared libraries: libconvecf.so.0: cannot open shared object file: No such file or directory"

Se puderem me ajudar, ficarei muito grato! É a primeira vez aqui na empresa que faço isso e quem fazia foi embora. Obrigado!

Uso CentOS 6.3


  


2. Re: Problema ao compilar com Makefile [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/05/2013 - 09:49h

A opção "-L" serve para informar a localização de bibliotecas em tempo de compilação, mas não em tempo de execução. Os nomes da bibliotecas, especificados com "-l" (L minúsculo), são embutidas no executável, mas o caminho do diretório onde a biblioteca está contida, especificado com "-L" (maiúsculo), não é.

Você pode aotar uma das seguintes opções.

1) Compilar do jeito como já vem compilando e, no momento da execução, especificar os diretórios onde bibliotecas podem ser buscadas por meio da variável de ambiente LD_LIBRARY_PATH.

2) Definir um local fixo (caminho absoluto, claro!, nunca confiando em diretório corrente e caminhos relativos) onde as bibliotecas serão instaladas, e usar outra opção do linker, "-rpath", que forçar a embutir no executável diretórios onde bibliotecas podem ser buscadas.

3) Usar a opção "-rpath", mas colocando no caminho de busca o nome especial "$ORIGIN" (com cuidado de escapar o "$", para não ser interpolado nem pelo make nem pelo shell). Esse valor faz com que o loader em tempo de execução procure pelas bibliotecas no mesmo diretório em que reside a aplicação. Ele pode também ser usado para compor um caminho, de modo que usar "-rpath $ORIGIN/../lib", tendo a aplicação sido executada a partir do caminho "/usr/local/my_app/bin/my_app", implicará que as bibliotecas podem ser buscadas em "/usr/local/my_app/lib".


3. Re: Problema ao compilar com Makefile [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 03/05/2013 - 11:26h

Aqui no Mint que utilizo raramente edito o arquivo ( /etc/ld.so.conf ) e acrescento mais um caminho completo da nova biblioteca ( /pasta_alguma_coisa ) ...

E para atualizar/funcionar usar o comando ( ldconfig ) depois de editado.

Pronto ...

PS: o saco maior foi ter que ligar o note e iniciar o Linux só para tentar te ajudar ... DETESTO USAR O NOTE EM HORARIO DE REPOUSO :)



4. Re: Problema ao compilar com Makefile [RESOLVIDO]

Ricardo Fabiano Silva
madrugada

(usa Gentoo)

Enviado em 03/05/2013 - 11:41h

Crie link para as libs necessárias em /usr/lib


5. Re: Problema ao compilar com Makefile

Jonathan Sansalone
JSansalone

(usa CentOS)

Enviado em 03/05/2013 - 13:38h

Estou deixando o meu Makefile desta maneira agora, estou usando o -rpath

swmfd := $(wildcard *.0)
all:
ifeq ($(strip $(swmfd)),)
@echo "Vai gerar link simbolo SWMFD"
@ln -s rt/lib/i386/libswmfd.so
@ln -s rt/lib/i386/libconvecf.so
endif
@echo "[Building...] -> swedamfd"
# @$(CXX) -O00 -g -Wall -o exemplo exemplo.cpp -lconvecf -lpthread -ldl
@$(CXX) -O00 -g -w -o swedamfd swedamfd.cpp -Wl,-rpath,'$ORIGIN' -Lrt/lib/i386 -lconvecf -lpthread -ldl

Compila sem problemas, mas ainda não executa. Alguma opção eu estou esquecendo? Obrigado!


6. Re: Problema ao compilar com Makefile [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/05/2013 - 14:21h

Tire o sinal de "@" da linha que chama o compilador. Veja se a string "$ORIGIN" é passada literalmente à linha de comando. Eu acho que não está sendo, e que possivelmente o make está interpolando "$O", seguido do texto literal "RIGIN" -- você provavelmente deveria ter escrito $$ORIGIN no Makefile.


7. Re: Problema ao compilar com Makefile

Jonathan Sansalone
JSansalone

(usa CentOS)

Enviado em 03/05/2013 - 14:52h

Pessoal, consegui!

Deixei a linha que chama o compilador desse jeito:

@$(cxx) -O00 -g -w -o swedamfd swedamfd.cpp -Wl,-rpath='$$ORIGIN/rt/lib/i386' -Wl,rpath-link=rt/lib/i386 -Lrt/lib/i386 -lconvecf -lpthread -ldl

O $ORIGIN estava sendo interpolado e ficava RIGIN, então eu coloquei mais um $ e no diretório rt/lib/i386 eu criei dois links para as bibliotecas com final .0

Agora funcionou!

Muito obrigado pela ajuda!

:D






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts