g++ linking libs instead of *.o containing static members leads to segfault

I observed segfaults if I used linking libraries instead of linking all the primary compiler output with g++. This problem occurs with libraries with classes with static members. And I don't find a solution with libs. What went wrong?

Simplified: I created two libraries called alpha and beta. Alpha contains a static member (race conditions were excluded). The library alpha depends on beta. And alpha and beta depend on a third library, the public library gamma (in my case Cairo).

The static member is defined as private within a class Alpha and access via getters and setters with mutex locks.

I compile my the source code for alpha

g++ -fPIC -DPIC `pkg-config --cflags gamma` alpha*.cpp -c
ar rcs alpha.a alpha*.o

and beta, respectively

g++ -fPIC -DPIC `pkg-config --cflags gamma` beta*.cpp -c
ar rcs beta.a beta*.o

Now, I want to use these libs (alpha, beta, and gamma) in my program delta. I tried two different ways to compile and link in two steps. First, compile and simply link the compiled objects:

g++ -fPIC -DPIC `pkg-config --cflags gamma` delta.cpp -c -o delta.o
g++ -fPIC -DPIC alpha*.o beta*.o delta.o `pkg-config --libs gamma` -o delta

This compiles, links and runs. Without any problems.

But if I want to use the .a libs instead and try:

g++ -fPIC -DPIC `pkg-config --cflags gamma` delta.cpp -c -o delta.o
g++ -fPIC -DPIC -lalpha -lbeta delta.o `pkg-config --libs gamma` -o delta

This compiles and links. But produces a segfault on running. During the very first access to the static member.



Comments

Popular posts from this blog

Spring Elasticsearch Operations

Object oriented programming concepts (OOPs)

Network Error and Timeout on Authorize.net JS