当前位置: 技术问答>linux和unix
利用Makefile生成可执行文件的问题
来源: 互联网 发布时间:2017-02-07
本文导语: 要求编写一个Makefile,利用它编译指定目录下的文件,并生成可执行文件(需要连接多个动态库)。目前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 ”和“-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
如果想自动搜索用-l(库名)如:libabc.so,连接就用-labc
|
那家伙是头驴。
用 -Lyourlibdirs -lyourlib 是最好的方式。
用 -Lyourlibdirs -lyourlib 是最好的方式。
|
好怪异的方法
|
呵呵 没怎么看懂
如果直接把动态库放在编译命令行中,执行的时候会限定动态库的查找路径
如果直接把动态库放在编译命令行中,执行的时候会限定动态库的查找路径