我有多个目标文件,这些目标文件是使用一些库链接和选项(库的costumary)编译的。 makefile以
结尾 $(PROG): lots.o of.o objects.o $(COMPLIB) $(LUA_OBJS)
$(CC) `$(CONFIGTHREADS)` -rdynamic -Wl,--as-needed -Wl,--version-script lua.vers -DGTK $^ -o $@ $(CONFIGLIB) $(LIBDL) -lm -lstdc++
其中,像往常一样$(CC)是C ++编译器,$(COMPLIB)是一个library.a文件,$(LUA_OBJ)另一大块外部对象...... 最大的问题是$(CONFIGLIB),它是$(LIBDL)和libm和liblstdc ++的链接和配置(带有一些强制选项,如-pthread)。
在我的特定情况下,总结果命令是:
g++ `` -rdynamic -Wl,--as-needed -Wl,--version-script lua.vers -DGTK lots.o of.o ojbects.o -o executable.x -pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgthread-2.0 -lgmodule-2.0 -lglib-2.0 -ldl -lm -lstdc++
但关键是我不是发布可执行文件,而是将所有这些,包含的库和编译选项包装成一个优雅的.o或.a文件,以便用作另一个项目的对象,无论复杂的makefile可能需要什么选项。
我知道
的存在ar crv library.a lots.o of.o objects.o
或
ld -r lots.o of.o objects.o -o wrap.o
但是当我尝试添加选项时,它们都会出错,也就是与库相关的非常重要和复杂的选项。
错误是: 与ld:无法识别的选项'-pthread' with ar:指定了两个不同的操作选项
此外,如果我使用ar crv(或ar rv)包装lots.o of.o objects.o获取wrap.a,
g++ wrap.a -o program.x -lots -of -options
不起作用。使用ld -r创建对象时可以使用。
我想到的解决方法是单独使用选项编译所有对象,然后结束,但这意味着严重重写makefile,可能会超出我的编译时间。