日期:2014-05-16  浏览次数:20640 次

利用Makefile生成可执行文件的问题
要求编写一个Makefile,利用它编译指定目录下的文件,并生成可执行文件(需要连接多个动态库)。目前Makefile已经编写好,因为存在公司了,所以在这里就不粘贴出来了,说一下我的问题。
  我的问题主要是在“连接多个动态库上”,头儿说,因为为了方便别人使用,不让用“-L ”和“-l”的这种连接方法,他给的方法是使用变量,然后和main.o之类的一起编译,生成可执行文件(因为反正动态库也是.o文件的集合)。通过如下例子来说明我的问题。
目录结构如下:
  test :bin:release_bin:libhello.so
  : main.c thanks.c
  : Makefile
如:OBJSO:=../bin/release_bin/libhello.so 以后可以扩展成多个动态库路径
  OBJS:= *.o $(OBJS)
。。。
exe: $(OBJS)
  $(CC) -o test $^ -lm 
  mv test ../bin/release_bin/libhello.so
程序大概就是这个方法。问题是:
1.在不写mv test ../bin/release_bin/libhello.so, 即可执行文件保留在当前目录的情况下
  无论我OBJSO设成绝对路径或者相对路径, 然后执行 ./test 则,执行正常
2.在写mv test ../bin/release_bin/libhello.so, 即可执行文件知道release_bin的情况下
  (1)若保持工作目录为当前目录,即Makefile所在目录,则../bin/release_bin/test 仍执行正常
  (2)若将工作目录移到test所在目录,即release_bin中,若OBJSO设成绝对路径,则 ./test 执行正常
  (3)若将工作目录移到test所在目录,即release_bin中,若OBJSO设成相对路径,则 ./test 执行报错,错误原因是:找不到“../bin/release_bin/libhello.so”


我的问题就是,我如何能够在既将test移到release_bin,又将OBJSO设成相对路径的情况下, 可执行文件test能正常执行。谢谢大家

------解决方案--------------------
写死会锁定连接
如果想自动搜索用-l(库名)如:libabc.so,连接就用-labc
------解决方案--------------------
那家伙是头驴。
用 -Lyourlibdirs -lyourlib 是最好的方式。
探讨

头儿不让用哪种方法,因为如果要是给别的同事用,当是多个动态库时,改动比较麻烦,所以头儿让用那个变量的方法。只是在使用哪种方式时,我遇到了上面不能兼顾的问题,所以请教下大家

------解决方案--------------------
好怪异的方法
------解决方案--------------------
呵呵 没怎么看懂
如果直接把动态库放在编译命令行中,执行的时候会限定动态库的查找路径