如何在考虑编译标志的情况下从多个源创建目标文件?

时间:2014-02-12 10:05:46

标签: c++ compiler-construction linker g++ ld

我有多个目标文件,这些目标文件是使用一些库链接和选项(库的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,可能会超出我的编译时间。

0 个答案:

没有答案