Solaris 生成共享库的问题

javabean 2006-10-23 01:47:21
从开源项目中抽取makefile中的部分,即如下makefile文件执行后可以
生成一个可执行文件myplayer。现在想将此可执行文件以动态链接库的
形式提供,于是将myplayr.cpp中的main函数改成startmain,用来接收
相应的参数。同时修改makefile生成动态链接库文件(.so)。但试了很
多次都不行。我的是在Solaris 9上编译。敬请高人指点,在生成动态库
时的makefile相关项应该怎么写才好?

由于长度限制分两次发。

#LIBPATH = /usr/local/lib
LIBPATH = .

#deine player lib version infomation
VERSION_MAJOR = 1
VERSION_MINOR = 0

srcdir = .
top_srcdir = ../..

pkgdatadir = $(datadir)/mpeg4ip
pkglibdir = $(libdir)/mpeg4ip
pkgincludedir = $(includedir)/mpeg4ip
top_builddir = ../..

datadir = ${prefix}/share
#libdir = ${exec_prefix}/lib
includedir = ${prefix}/include

prefix = /usr/local

include_HEADERS = \
codec_plugin.h \
rtp_plugin.h \
text_plugin.h \
mpeg4ip.h \
codec_plugin_private.h \
<rtsp/rtsp_client.h> \
player_session.h \
player_media.h \
player_util.h \
our_msg_queue.h \
ip_port.h \
media_utils.h \
playlist.h \
our_config_file.h \
<rtp/debug.h> \
<libhttp/http.h> \
video.h \
video_sdl.h \
mpeg4ip_getopt.h \
mpeg2t/mpeg2_transport.h \
mpeg2ps/mpeg2_ps.h

@HAVE_MAC_OSX_FALSE@SDL_AUDIO_FLAGS =
@HAVE_MAC_OSX_TRUE@SDL_AUDIO_FLAGS = -framework CoreAudio -framework AudioToolbox
@HAVE_MAC_OSX_FALSE@SDL_AUDIO_LIB = $(top_builddir)/lib/SDLAudio/src/libmpeg4ipSDL.la
@HAVE_MAC_OSX_TRUE@SDL_AUDIO_LIB = $(top_builddir)/player/lib/audio/portaudio/libportaudio.la
@HAVE_MAC_OSX_FALSE@SDL_AUDIO_INC = -I$(top_srcdir)/lib/SDLAudio/include
@HAVE_MAC_OSX_TRUE@SDL_AUDIO_INC = -I$(top_srcdir)/player/lib/audio/portaudio
@HAVE_MAC_OSX_FALSE@ADD_CFLAGS =
@HAVE_MAC_OSX_TRUE@ADD_CFLAGS = -Ddarwin -D_THREAD_SAFE -DNEED_SDL_VIDEO_IN_MAIN_THREAD


SDL_AUDIO_FLAGS =
#SDL_AUDIO_FLAGS = -framework CoreAudio -framework AudioToolbox
SDL_AUDIO_LIB = $(top_builddir)/lib/SDLAudio/src/libmpeg4ipSDL.la
#SDL_AUDIO_LIB = $(top_builddir)/player/lib/audio/portaudio/libportaudio.la
SDL_AUDIO_INC = -I$(top_srcdir)/lib/SDLAudio/include
#SDL_AUDIO_INC = -I$(top_srcdir)/player/lib/audio/portaudio
ADD_CFLAGS =
#ADD_CFLAGS = -Ddarwin -D_THREAD_SAFE -DNEED_SDL_VIDEO_IN_MAIN_THREAD

# lib target.
#LIB_TARGET = libmyplayer.so.$(VERSION_MAJOR).$(VERSION_MINOR)
#LIB_TARGET = libmyplayer.so
#PROG_TARGET = myplayer


myplayer_LDFLAGS = $(SDL_AUDIO_FLAGS)
myplayer_LDADD = \
-lm $(SDL_AUDIO_LIB) \
libmp4player.la \
libmp4syncbase.la \
libmp4syncsdl.la \
libmp4sdlvideo.la \
libmp4syncbase.la \
libmp4playerutils.la \
$(top_builddir)/lib/audio/libaudio.la \
$(top_builddir)/lib/ismacryp/libismacryp.la \
-L/usr/local/lib -R/usr/local/lib -lSDL -lpthread -lposix4

#
#COMMOBJS = myplayer.o
MAINOBJS = myplayer.o

#HEADERS = myplayer.h
HEADERS = $(include_HEADERS)
CC = gcc -g -fPIC
DEFS = -DHAVE_CONFIG_H
CPPFLAGS =
CXXFLAGS = -g -O2 -DMPEG4IP -I/usr/local/include/SDL -D_REENTRANT
AM_CFLAGS = -D_REENTRANT -Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Wno-char-subscripts -Wno-unknown-pragmas -Wformat=2 -Wdeclaration-after-statement -Wpointer-arith -Wsign-compare -Wswitch-enum -Wnested-externs -Wswitch-enum -DPLAYER_PLUGIN_DIR=\"${exec_prefix}/lib/mp4player_plugin\" $(ADD_CFLAGS)
AM_CXXFLAGS = -D_REENTRANT -DNOCONTROLS -fexceptions -Wall -Wno-char-subscripts -Woverloaded-virtual -Wno-unknown-pragmas -Wno-deprecated -Wformat=2 -Wpointer-arith -Wsign-compare -DPLAYER_PLUGIN_DIR=\"${exec_prefix}/lib/mp4player_plugin\" $(ADD_CFLAGS)
CFLAGS = -g -O2 -DMPEG4IP -I/usr/local/include/SDL -D_REENTRANT
CPP = gcc -E
CXX = g++
CXXCPP = g++ -E
CXXDEPMODE = depmode=gcc3
SHELL = /bin/bash
LIBS = -ldl -lnsl -lsocket
LIBTOOL = $(SHELL) $(top_builddir)/libtool

PROGS = myplayer
#PROGS = myplayer.so

INCLUDES = \
-I$(top_srcdir)/include \
-I$(top_srcdir)/player/lib \
-I$(top_srcdir)/player/lib/audio \
-I$(top_srcdir)/player/lib/libhttp \
-I$(top_srcdir)/player/lib/rtsp \
$(SDL_AUDIO_INC) \
-I/usr/local/include \
-I/usr/local/include/SDL \
-I$(top_srcdir)/lib \
-I$(top_srcdir)/lib/avi \
-I$(top_srcdir)/lib/ismacryp \
-I$(top_srcdir)/lib/mp4av \
-I$(top_srcdir)/lib/mp4 \
-I$(top_srcdir)/lib/mp4v2 \
-I$(top_srcdir)/lib/mpeg2ps \
-I$(top_srcdir)/lib/msg_queue \
-I$(top_srcdir)/lib/rtp \
-I$(top_srcdir)/lib/sdp \
-I$(top_srcdir)/lib/utils \
-I$(top_srcdir)/lib/audio \
-I/usr/openwin/include
am__DEPENDENCIES_1 = $(top_builddir)/lib/SDLAudio/src/libmpeg4ipSDL.la
am_myplayer_OBJECTS = myplayer.o
myplayer_OBJECTS = $(am_myplayer_OBJECTS)
myplayer_DEPENDENCIES = $(am__DEPENDENCIES_1) libmp4player.la \
libmp4syncbase.la libmp4syncsdl.la libmp4sdlvideo.la \
libmp4syncbase.la libmp4playerutils.la \
$(top_builddir)/lib/audio/libaudio.la \
$(top_builddir)/lib/ismacryp/libismacryp.la
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)

COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CXXFLAGS) $(CXXFLAGS)
CXXLD = $(CXX)
CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
...全文
282 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
laoeyu 2006-10-30
  • 打赏
  • 举报
回复
很高兴看到你的问题解决了。也谢谢你让我知道了。^_^
laoeyu 2006-10-30
  • 打赏
  • 举报
回复
很高兴看到你的问题解决了。也谢谢你让我知道了。^_^
laoeyu 2006-10-30
  • 打赏
  • 举报
回复
很高兴看到你的问题解决了。也谢谢你让我知道了。^_^
javabean 2006-10-30
  • 打赏
  • 举报
回复
谢谢关注。问题解决了。
javabean 2006-10-27
  • 打赏
  • 举报
回复
谢谢!我们现在用的是mpeg4ip-1.4.1版本,在上面做了些修改。solaris 9,gcc 3.4.2。是在www.mpeg4ip.net上下载的mpeg4ip-1.4.1.tar.gz。编译后产生mp4player(mpeg4ip-1.4.1/player/src)的可执行程序。现在就是想将这个mp4player改成一个可以提供api的动态库。因为对autoconf,automake等都不清楚,所以将编译生成mp4player的部分Makefile(mpeg4ip-1.4.1/player/src下)文件中的语句抽了出来。单独生成执行程序,没有问题,可将main函数更名,修改相关参数,加上-shared -fPIC等编译项之后就是生成不了动态库文件。
敬请赐教,多谢了!
laoeyu 2006-10-26
  • 打赏
  • 举报
回复
现在怎么样了?
如果还不行的话,你把编译的是哪个版本的mplayer告诉我,哪里下载的,还有Solaris,还有gcc的版本统统告诉我。
javabean 2006-10-24
  • 打赏
  • 举报
回复
谢谢了先。
我是带了fPIC的。不过还是先用file命令看一下libmpeg4ipSDL.la。
laoeyu 2006-10-24
  • 打赏
  • 举报
回复
一般都要加上fPIC的。

你可以用file命令看一下这个libmpeg4ipSDL.la文件,看看系统返回什么。
javabean 2006-10-24
  • 打赏
  • 举报
回复
对不起,上面在拷贝时弄错了,所有的mltmp4player都应该是myplayer
javabean 2006-10-24
  • 打赏
  • 举报
回复
用file命令看libmpeg4ipSDL.la返回 ascii text。结果是个文本文件。我看了,里面是一些依赖说明。可是我只编译成执行文件就是可以的啊。

另外将上述生成文件的一句写成:
libmyplayer.so: $(myplayer.so_OBJECTS) $(myplayer_DEPENDENCIES)
$(LIBTOOL) --tag=CC --mode=compile $(CC) -shared $(myplayer_LDFLAGS) $(myplayer_OBJECTS) $(myplayer_LDADD) -lm $(LIBS) -o $@
则错误成:
# make -f Makelib
/bin/bash ../../libtool --tag=CC --mode=compile gcc -g -fPIC -shared myplayer.o -lm ../../lib/SDLAudio/src/libmpeg4ipSDL.la libmp4player.la libmp4syncbase.la libmp4syncsdl.la libmp4sdlvideo.la libmp4syncbase.la libmp4playerutils.la ../../lib/audio/libaudio.la ../../lib/ismacryp/libismacryp.la -L/usr/local/lib -R/usr/local/lib -lSDL -lpthread -lposix4 -lm -ldl -lnsl -lsocket -o libmltmp4player.so
libtool: compile: cannot determine name of library object from `libmyplayer.so'
make: *** [libmltmp4player.so] Error 1
没搞过,真不知道该怎么弄。敬请高人赐教!
javabean 2006-10-23
  • 打赏
  • 举报
回复
# Define all the files for an all build, very improtant.
all: $(PROGS)


myplayer$(EXEEXT): $(myplayer_OBJECTS) $(myplayer_DEPENDENCIES)
@rm -f myplayer$(EXEEXT)
$(CXXLINK) $(myplayer_LDFLAGS) $(myplayer_OBJECTS) $(myplayer_LDADD) $(LIBS)

#生成库,可是怎么都不行
#libmyplayer.so: $(myplayer_OBJECTS) $(myplayer_DEPENDENCIES)
# -$(CC) -shared -o $(LIB_TARGET) $(LIBTOOL) --tag=CC --mode=compile $(myplayer_LDFLAGS) $(myplayer_OBJECTS) $(myplayer_LDADD) $(LIBS)


用上面的相关LINK命令也是不能成功,如
#libmyplayer.so: $(myplayer_OBJECTS) $(myplayer_DEPENDENCIES)
# $(CXXLINK) $(myplayer_LDFLAGS) $(myplayer_OBJECTS) $(myplayer_LDADD) $(LIBS)

.c.o:
if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi

.c.obj:
if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi

.c.lo:
if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi

.cpp.o:
if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi

.cpp.obj:
if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi

.cpp.lo:
if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi

.PHONY : clean

clean :
# rm $(COMMOBJS)
rm *.o
rm *~ -f

错误的信息:
gcc -g -shared -o libmltmp4player.so mltmp4player.o -lm ../../lib/SDLAudio/src/libmpeg4ipSDL.la libmp4player.la libmp4syncbase.la libmp4syncsdl.la libmp4sdlvideo.la libmp4syncbase.la libmp4playerutils.la ../../lib/audio/libaudio.la ../../lib/ismacryp/libismacryp.la -L/usr/local/lib -R/usr/local/lib -lSDL -lpthread -lposix4 -ldl -lnsl -lsocket
ld: fatal: file ../../lib/SDLAudio/src/libmpeg4ipSDL.la: unknown file type
ld: fatal: File processing errors. No output written to libmltmp4player.so
collect2: ld returned 1 exit status
make: [libmltmp4player.so] Error 1 (ignored)

libmpeg4ipSDL.la确实是存在且路经正确。在编译成执行文件时就没有问题。敬请高人指点不胜感激!

1,543

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 Solaris
社区管理员
  • Solaris
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧