Compilando em Linux

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!

:smiley: