首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于动态库、静态库的有关问题

2012-02-22 
关于动态库、静态库的问题最近两天遇到一个问题,在linux下用c语言写的应用程序用到了一个第三方提供的库文

关于动态库、静态库的问题
最近两天遇到一个问题,在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$

热点排行