I have some basic questions regarding linking against a C/C++
library. I am trying to understand the difference in using the two different usages -L/usr/local/lib -lm
usage and /usr/local/lib/libm.a
usage. E.g., when I compile and link an example from the [SUNDIALS]
library, both of the following work
gcc -Wall cvRoberts_dns.c -o cvRoberts_dns.exe -I/usr/local/include -L/usr/local/lib/ -lsundials_cvode -lsundials_nvecserial -lm
OR
gcc -Wall cvRoberts_dns.c -o cvRoberts_dns.exe /usr/local/lib/libsundials_cvode.a /usr/local/lib/libsundials_nvecserial.a
However, to compile and link an example from the library [libsbml]
, the following works
g++ -Wall readSBML.cpp -o readSBML.exe -I/usr/local/include -L/usr/local/lib -lsbml
but the this does not
g++ -Wall readSBML.cpp -o readSBML.exe /usr/local/lib/libsbml.a
If required, I can post the complete error message I get, but the last line of the message is as follows
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
My questions are as follows:
In the second style of linking (of the first example), there is no information regarding where to find the
include
files (header files), how does the compiler know the information supplied in-I/usr/local/include
which is provided in the first style of the first example?In the second style of first example there is no
/usr/local/lib/libm.a
(it actually gives an error message thatlibm.a
cannot be found if I try to include it), then why-lm
is required in the first style?How do I compile the second example in the second style (i.e., using
/usr/local/lib/libsbml.a
)? I do see that there are files -libsbml.a
andlibsbml-static.a
in the/usr/local/lib
folder, but none of them work.
If it helps, I am on an OS X
machine.
I would be very thankful if any one could help in this regard.
Just an update - I tried
g++ -Wall readSBML.cpp -o readSBML.exe /usr/local/lib/libsbml.5.dylib
and that compiled and linked just fine.
Thanks SN