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.