On Mon, 30 Oct 2000, kason wong wrote: > I guess I finally understand. but i still have problem in compiling one lib: >libutil.so which > used the libpthread.a lib in c. I try to convert libpthread.a to .so, it seems >strange but > when i load it: > > ld -shared -o libpthread.so --whole-archive /local/usr/lib/libpthread.a > ldd -r libpthread.so > statically linked > > I think this is the main problem when i convert libutil.a to libutil.so and i try to >load > libutil.so Where is libutil.a coming from? if that's your code, then you aren't linking it properly. Convert any lib*.a files it depends upon to lib*.so, then use the g++ -shared -o libutil.so command to create it. Then ldd -r libutil.so and make sure it found everything it needed. If it didn't, add the missing library to the g++ command and try again until it finds every symbol it needs. Then you will be able to loadLibrary("util") and see it work. If you're creating a .a file, by definition that doesn't include all the dependent routines. Here's my entire Makefile. It has exactly the stuff you need, I suggest you use a copy of it and edit appropriately. Mass-replace libjsystem.so with your libutil.so. Stick -lpthread into LINKLIBS. Stuff in LINKLIBS is system libs which already have *.so files. Edit paths to refer to your directories instead of mine. Any libs you possess which are only in lib*.a form should be placed in APILIBS. Put their *.so forms in APISOLIBS. Place your final library, libutil.so, in JAPILIBS. Then edit the build rule for libjsystem.so to name it libutil.so, and adjust the *.c and *.h filenames appropriately. Don't change anything else on the line. I've also attached my bash script which returns an error code if the ldd -r command returns undefined errors. That causes make to stop and whine if the build fails, otherwise make doesn't know it's a bad build. ------------------------------------------------------------------------ .SUFFIXES : .h .c .a .so .java .class .a.so: ld -shared -o $*.so --whole-archive $< nm $*.so >$*.symbols .java.class: true # # location of JVM we're linking to # # Sun's 1.2.2 # JAVA_HOME=/usr/local/java/jdk1.2.2 JAVA_INC= -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux JAVAH=/usr/local/java/jdk1.2.2/bin/javah # # gcc configurable compile options # -H list include header names # -g debugging code enabled GCCOPT= -g LDOPT=-Xlinker -t -Xlinker -Map -Xlinker /tmp/linkmap -Xlinker -cref GCCDEF=-DIP_SUPPORT -DUNIX # # Where the library.so file is written # LIBOUT=$(HOME)/lib # # Carol's C api libraries in their converted form # These start as .a files, I have to convert them to # shareable .so files for JNI to access them. # JAPILIBS=\ $(LIBOUT)/libjsystem.so # $(LIBOUT)/libjnat.so \ # $(LIBOUT)/libjudpmsg.so \ # $(LIBOUT)/libjuser.so \ # $(LIBOUT)/libjvoip.so APISOLIBS=$(LIBOUT)/libnat.so \ $(LIBOUT)/libsystem.so \ $(LIBOUT)/libudpmsg.so \ $(LIBOUT)/libuser.so \ $(LIBOUT)/libvoip.so APILIBS=$(LIBOUT)/libnat.a \ $(LIBOUT)/libsystem.a \ $(LIBOUT)/libudpmsg.a \ $(LIBOUT)/libuser.a \ $(LIBOUT)/libvoip.a LINKLIBS=-L$(LIBOUT) -lnat -lsystem -ludpmsg -luser -lvoip -lc # # Project's root directory # PROJ=$(HOME)/jbproject/NSApi # # Project's source root and classpath root # SRC=$(PROJ)/src CLASSES=$(PROJ)/classes # # base name of the library # LIBNAME=jsubsystem # # C Source files for gcc command # CSRC=$(SRC)/JNsApiSubsystemInterfaces.c # # Java Class files # JCLASSES= $(CLASSES)/com/aravox/nsapi/*.class \ $(CLASSES)/com/aravox/nsapi/subsystem/*.class # # all sources lib depends upon # ALLSRC= $(SRC)/*.h $(SRC)/*.c $(JCLASSES) all: $(APISOLIBS) $(JAPILIBS) $(ALLSRC) $(CLASSES)/md5_sha1 $(LIBOUT)/libjsystem.so: \ $(SRC)/JNsApiSubsystemInterfaces.h \ $(SRC)/JNsApiSubsystemInterfaces.c \ $(CLASSES)/com/aravox/nsapi/subsystem/JNsApiSubsystemInterfaces.class - rm -f $@ @echo Creating $@... gcc $(GCCOPT) $(GCCDEF) $(JAVA_INC) -I$(SRC) \ $(LDOPT) \ -shared -o $@ $(SRC)/JNsApiSubsystemInterfaces.c \ $(LIBOUT)/lib*.so /home/joi/bin/anyUndefined $(LIBOUT)/lib*.so $(SRC)/JNsApiSubsystemInterfaces.h: $(SRC)/com/aravox/nsapi/subsystem/JNsApiSubsystemInterfaces.java - ls -lart $(SRC)/com/aravox/nsapi/subsystem/JNsApiSubsystemInterfaces.java $(SRC)/JNsApiSubsystemInterfaces.h $(SRC)/JNsApiSubsystemInterfaces.h $(JAVAH) \ -classpath $(CLASSES) \ -o $(SRC)/JNsApiSubsystemInterfaces.h \ com.aravox.nsapi.subsystem.JNsApiSubsystemInterfaces echo "$(SRC)/JNsApiSubsystemInterfaces.h regenerated"; $(SRC)/com/aravox/nsapi/JNsApiSubsystemInterfaces.java: @echo "Nothing to do." ------------------------------------------------------------------------ -- Joi Ellis Software Engineer Aravox Technologies [EMAIL PROTECTED], [EMAIL PROTECTED] No matter what we think of Linux versus FreeBSD, etc., the one thing I really like about Linux is that it has Microsoft worried. Anything that kicks a monopoly in the pants has got to be good for something. - Chris Johnson
#!/bin/bash tmp=/tmp/anyUndefined.$$ ldd -r $1 >$tmp 2>&1 echo "----------" cat $tmp echo "----------" if grep undefined $tmp; then exit 1 else exit 0 fi