关于动态库、静态库的问题
最近两天遇到一个问题,在linux下用c语言写的应用程序用到了一个第三方提供的库文件。编译成 .a 静态库以后再编译出来的应用程序运行结果正常。 .so的话应用程序的运行结果就会出错。在调用库函数的时候会返回不正常的值。
希望各位能指点一下。
[解决办法]
不太懂linux下的动态连接,帮up
[解决办法]
关键是在编译库的源文件时要加 -fPIC选项,运行时要设置LD_LIBRARY_PATH环境变量,下面是一个简单的例子:
mymtom@fc6:src/csdn/c/hello$ ls
hello.c hello.h main.c Makefile world.c world.h
mymtom@fc6:src/csdn/c/hello$ cat Makefile
PROG = hello
SRCS = main.c
OBJS = $(SRCS:.c=.o)
LIBS = libhello.so
LSRCS = hello.c world.c
LOBJS = $(LSRCS:.c=.So)
LDFLAGS = -L.
LDLIBS = -lhello
PICFLAG = -fPIC
RM = rm -f
.SUFFIXES: .So
.c.So:
$(CC) $(PICFLAG) $(CFLAGS) -c $ < -o $@
all: $(PROG)
hello: $(OBJS) $(LIBS)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $@
libhello.so: $(LOBJS)
$(CC) $(LDFLAGS) -shared -o $@ $(LOBJS)
clean:
$(RM) a.out core *.core
$(RM) $(PROG) $(OBJS)
$(RM) $(LIBS) $(LOBJS)
mymtom@fc6:src/csdn/c/hello$ cat main.c
#include "hello.h "
#include "world.h "
int main(void)
{
hello(world());
return 0;
}
mymtom@fc6:src/csdn/c/hello$ cat hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *);
#endif /* HELLO_H */
mymtom@fc6:src/csdn/c/hello$ cat world.h
#ifndef WORLD_H
#define WORLD_H
const char * world(void);
#endif /* WORLD_H */
mymtom@fc6:src/csdn/c/hello$ cat hello.c
#include <stdio.h>
#include "hello.h "
void hello(const char *s)
{
(void)printf( "Hello, %s\n ", s);
}
mymtom@fc6:src/csdn/c/hello$ cat world.c
#include "world.h "
const char * world(void)
{
return "World! ";
}
mymtom@fc6:src/csdn/c/hello$ make
cc -c -o main.o main.c
cc -fPIC -c hello.c -o hello.So
cc -fPIC -c world.c -o world.So
cc -L. -shared -o libhello.so hello.So world.So
cc -L. main.o -lhello -o hello
mymtom@fc6:src/csdn/c/hello$ export LD_LIBRARY_PATH=.
mymtom@fc6:src/csdn/c/hello$ ./hello
Hello, World!
mymtom@fc6:src/csdn/c/hello$ ls
hello hello.h libhello.so main.o world.c world.So
hello.c hello.So main.c Makefile world.h
mymtom@fc6:src/csdn/c/hello$ uname -a
Linux fc6.unix-center.net 2.6.18-1.2798.fc6 #1 SMP Mon Oct 16 14:39:22 EDT 2006 x86_64
mymtom@fc6:src/csdn/c/hello$