in reply to Inline::C external library linking problem

The compiler option -L/usr/local/lib does not automatically add the path to the list of runtime library search paths. It only makes the library be found at compile time.  Unless /usr/local/lib is otherwise configured to be searched by the dynamic linker, the shared library won't be found at runtime (which seems to be the problem in your case).

The runtime library search paths are normally set using the linker option -rpath, or the environment variable LD_RUN_PATH (at compile time).

That's where MakeMaker comes in (or should). Normally, it would take care of setting the appropriate LD_RUN_PATH when it sees something like LIBS => ['-L/usr/local/lib -lgeotiff'].  In the generated Makefile you should find definitions like

# See ExtUtils::Liblist for details # EXTRALIBS = -L/usr/local/lib -lgeotiff LDLOADLIBS = -L/usr/local/lib -lgeotiff BSLOADLIBS = LD_RUN_PATH = /usr/local/lib

which would then prepend LD_RUN_PATH="/usr/local/lib" to the gcc -shared ... -L/usr/local/lib -lgeotiff command line.  I'm not sure why this isn't happening in your case.

In addition to adding /usr/local/lib to LD_LIBRARY_PATH (which is ugly, as it always needs extra fiddling at runtime), you could try the following workarounds:

(1) specify the appropriate -rpath yourself. For this, you'd need to somehow get -Wl,-rpath=/usr/local/lib into the link command. This isn't quite as easy as you might think, because Inline::C's LDDLFLAGS option doesn't allow adding to it, so you'd need to re-specify all other options, which you typically wouldn't know, as they are being auto-configured...  What does seem to work, though, is misusing the LD option, by setting

LD => 'gcc -Wl,-rpath=/usr/local/lib'

(which did create the appropriate linker command line, for me)

(2) In case you also have a static library libgeotiff.a, you could link against that one, in which case you wouldn't have any additional runtime dependencies (the static lib would need to have been compiled with -fPIC, though, because it will be linked with a shared lib).  If you have both shared (.so) and static (.a) versions in /usr/local/lib, you'd need to move away the shared one, because gcc defaults to using the shared lib, if found. Alternatively, specify the full path to the .a file directly via MYEXTLIB (instead of -L/usr/local/lib -lgeotiff), i.e.

MYEXTLIB => '/usr/local/lib/libgeotiff.a'

Replies are listed 'Best First'.
Re^2: Inline::C external library linking problem
by Anonymous Monk on Oct 20, 2010 at 06:38 UTC
    Hi I am facing an error in Cygwin, when I run Perl scripts which talks to DLL files Laptop specification: HP Elite book Model – 8540W Intel i5 64 bit processor Win XP OS Software – Cygwin Additional modules – Inline & Parse Rec descent. My Perl installation in Cygwin is done properly, I am sure about that (I ran some simple “hello world” kind of scripts & that is working fine). I checked the installation of Inline & Parse Rec Descent it has installed it properly. I checked this using “make test” script, I get all the tests are passing in both Inline & Parse Rec descent. When I run Perl scripts which uses DLL files I get this error, Please see the error below. MY Perl scripts uses *.PM Perl modules which talks to DLL files of a particular hardware. As per the error below it couldn’t find some the files at run time or compiling stage, however, I checked it all the required files are present in the _Inline folder. I don’t understand why it couldn’t load it at run time or compile time….! This is the error. Had problems bootstrapping Inline module 'Corelis_JTAG_6bd5' Can't load '/cygdrive/c/test/_Inline/lib/auto/Corelis_JTAG_6bd5/Corelis_JTAG_6bd 5.dll' for module Corelis_JTAG_6bd5: No such file or directory at /usr/lib/perl5 /5.8/cygwin/DynaLoader.pm line 230. at /usr/lib/perl5/site_perl/5.8/Inline.pm line 500 at Corelis_JTAG.pm line 25 BEGIN failed--compilation aborted at Corelis_JTAG.pm line 25. Compilation failed in require at ./crm_bist.pl line 33. BEGIN failed--compilation aborted at ./crm_bist.pl line 33. Moreover, the same Cygwin installation, Inline version, Parse Rec descent is done the same way in other two IBM Desktops & one TOSHIBA laptop. There is literally no difference between the scripts & installation in other PC's. However, the new laptop I am trying is not going through & it throughs me the above error. But, in my IBM PC & Toshiba laptop works fine. The new laptop which is not working is HP Elite book 8540W with SATA SSD hard disk. This leaves me to suspect two things. 1. The OS (Win XP) version or installation problem!!!!!! (The Win XP in the desktop & laptop is about 5 years old version of Win XP - I don't know what would help there to you to debug this..) 2. The hard disk in IBM desktop is IDE & the one in Toshiba laptop is SATA2!!!!. The new laptop which is not working is HP Elite book 8540W with SATA SSD hard disk. Does hard disk matters for Cygwin at all.. Do you think the above two reasons would make anything to fail in Cygwin, what dependencies they have with respect to Cygwin. Please help. Shasi