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 [color=red]libconvecf.so[/color] e [color=red]libswmfd.so[/color] 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!
Procure por “-rpath” na documentação do ld (linker do Unix/Linux).
Por exemplo, pode ser que no gcc / g++ você tenha de passar algo parâmetro como:
-Wl,-rpath=./rt/lib/i386
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!
Você não leu o man ld?
-rpath requer um path depois do sinal de =. Do jeito que você escreveu, não há um sinal de = depois da opção rpath.
Em alguns sites eles usam espaço, vírgula e igual, mas ainda não funciona
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!
