Re: Broken SO due to dropped dependencies

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2013/3/29 Ian Lance Taylor <iant@xxxxxxxxxx>:
> On Fri, Mar 29, 2013 at 7:56 AM, Miguel Guedes
> <miguel.a.guedes@xxxxxxxxx> wrote:
>> I take it you don't think there's anything wrong with GCC? Is the
>> different behaviour between GCC and clang expected in this case?
>
> OK, I looked a bit closer, and I see the problem.  You are listing the
> -l options before the .o files.  With GCC, that means that the -l
> options are effectively ignored.  I guess clang must rearrange the -l
> options in that case, although I don't know how that could work
> reliably while preserving Unix linking semantics.
>
> Move your -l options after your .o files.
>
> Ian


To my understanding, the linking order is required for static libraries.
There is no order requirement for object files or dynamic libraries.


For example, given a file z.c:

[z.c]

#include <math.h>

int main(int argc, char **argv)
{
  float f;

  f = sqrt (argc);

  return ((int) f);
}

<A>
$ gcc -c z.c
$ gcc -lm z.o

<B>
$ gcc -c z.c
$ gcc -static -lm z.o

Case <A> is ok.
But case <B> will show up "undefined reference to `sqrt'" message
unless you place '-lm' after z.o.


Another example, given two files f.c and f2.c:

[f.c]

extern int func (int);

int main()
{
  int result;
  result = func (9);
  return result;
}

[f2.c]

int func(int k)
{
  return k;
}

$ gcc -c f.c
$ gcc -c f2.c
$ ar rc libf2.a f2.o

<C>
$ gcc f.o libf2.a

<D>
$ gcc libf2.a f.o

<E>
$ gcc -L. -lf2 f.o

Case <C> is ok.
But case <D> and <E> both show up "undefined reference to `func'" message.


So my guess is that Miguel used some symbols which
reside in static libraries such as libomnis.a or other -lxxxxx.


Best regards,
jasonwucj




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux