Linkowanie programu z biblioteką współdzieloną i brak sekcji pod Linuksem


(nintyfan) #1

Próbuję zlinkować własny program ze swoją biblioteką. Problem w tym, że jedna funkcja jest w niezdefiniowanej sekcji, przez co program się nie kompiluje. Funkcja nie jest statyczna, a więc powinna być w sekcji .text.

 

Otio Makefile dla pliku z funkcją:

files: *.c
        gcc -g -fPIC -c [^p]*.c -fvisibility=hidden


run:
        LD_LIBRARY_PATH=${PWD}/../..:${PWD}/.. /bin/bash -c 'cd ../..; Demos/główny.c.o --tao-module morph-gtk.so

A oto Makefile dla pliku biblioteki:

TAO_LIB=libgreattao.so.2.0                                                             
PROGPATH?=Demos/główny.o                                                               
INSTALLPATH?="/usr/local/"
a!=uname -m
lib64!=[${a} == "x86_64"] && echo 64 || echo
targets!=ls *.c | sed  -e 's/\.c /\.o /g' | sed -e  's/\.c$$/\.o/g'

%.o: %.c
        gcc -fvisibility=hidden -o $@ -g -O0 -fPIC -c $< -ldl `pkg-config --cflags SDL2_image --libs SDL2_image` -DINSTALLPATH=\"${INSTALLPATH}\";

$(TAO_LIB): tao.o multilisted.o $(targets)
        gcc -O0 -g  -shared -Wl,-soname,libgreattao.so -o libgreattao.so.2.0 *.o -ldl -lsell -lnotify Modules/common/data_ctr_common.o network/network_main.o network/network_utils.o network/dialogs.o `pkg-config --cflags SDL2_image --libs SDL2_image` `pkg-config --cflags glib` `pkg-config --libs openssl --cflags openssl` Modules/common/timers.o
        ln -fs libgreattao.so.2.0 libgreattao.so.2
        ln -fs libgreattao.so.2 libgreattao.so

tao.o: *.c network/*.c

        gcc -fvisibility=hidden -g -O0 -fPIC -c common/debug.c
        gcc -fvisibility=hidden -g -O0 -fPIC -c network/main.c -o network/network_main.o `pkg-config --libs openssl --cflags openssl`
        gcc -fvisibility=hidden -g -O0 -fPIC -c network/network-utils.c -o network/network_utils.o
        gcc -fvisibility=hidden -g -O0 -fPIC -c network/dialogs.c -o network/dialogs.o

multilisted.o:
        gcc -c -fPIC common/multi_listed.c

clean:
        rm *.o
        rm libgreattao.so*

depends:
        @echo Missing libraries needed to compile engine of libgreattao
        @pkg-config --cflags SDL2_image --libs SDL2_image > /dev/null
        @pkg-config --cflags openssl --libs openssl > /dev/null
        @echo Missing libraries needed to compile Gtk+2.0 backend of libgreattao
        @pkg-config --cflags gtk+-2.0 --libs gtk+-2.0 > /dev/null
        @echo Missing libraties needed to compile Qt backend of libgreattao
        @pkg-config --cflags QtGui --libs QtGui > /dev/null

prepare-for-tests:
        mkdir -p mWidgets_modules
        cp Modules/tao-*.so.1.0 mWidgets_modules
        ln -fs tao-gtk.so.1.0 mWidgets_modules/tao-gtk.so

test: prepare-for-tests
        LD_LIBRARY_PATH="${PWD}" ${PROGPATH}

install:
        cp -r tao-design ${INSTALLPATH}/share
        mkdir -p ${INSTALLPATH}/lib${lib64}/mWidgets_modules
        cp  Modules/tao-*.so.1.0 -t ${INSTALLPATH}/lib${lib64}/mWidgets_modules
        ln -fs tao-gtk.so.1.0 ${INSTALLPATH}/lib${lib64}/mWidgets_modules/tao-gtk.so.1
        ln -fs tao-gtk.so.1 ${INSTALLPATH}/lib${lib64}/mWidgets_modules/tao-gtk.so
        cp  libgreattao.so.2.0 ${INSTALLPATH}/lib${lib64}
        ln -fs libgreattao.so.2.0 ${INSTALLPATH}/lib${lib64}/libgreattao.so.2
        ln -fs libgreattao.so.2 ${INSTALLPATH}/lib${lib64}/libgreattao.so
        mkdir -p ${INSTALLPATH}/include/libgreattao
        cp Includes/tao.h ${INSTALLPATH}/include/libgreattao
        cp Includes/config.h ${INSTALLPATH}/include/libgreattao
        cp Includes/network.h ${INSTALLPATH}/include/libgreattao
        cp Includes/log.h ${INSTALLPATH}/include/libgreattao
all:
        make
        make -C Demos
        make -C Modules
        make test

 

Myślę, że ma to związek z flagą visibility, ale sprawdzałem, i chyba nie ma.