gcc命令行中静态库的cpptask排序

Posted

技术标签:

【中文标题】gcc命令行中静态库的cpptask排序【英文标题】:cpptask ordering of static libraries in gcc command line 【发布时间】:2010-03-20 02:17:30 【问题描述】:

如何强制 cpptask 将静态库移动到发布给编译器的 arg 列表的末尾?

这是我正在使用的子句

   <cpptasks:cc description="appname" subsystem="console" objdir="obj" outfile="dist/app_test">
            <compiler refid="testsslcc" />      
            <linkerarg value="-L$libdir" />   
            <linkerarg value="-L/usr/local/devl/lib" />
            <linkerarg value="-Wl,-rpath,../lib" />
            <libset libs="unittest $libs dsg readline ncurses gcov" />
            <fileset dir="test/obj" includes="main.o" />
            <fileset dir="." includes="$TCFILES" />
            <fileset dir="../lib" includes="libboost_thread.a libboost_date_time.a" />                                                     
    </cpptasks:cc> 

当它执行时,libboost_thread.a libboost_date_time.a 是参数列表中通过编译器的第一个文件,

gcc -ggdb -Wl,-export-dynamic -Wshadow -Wno-format-y2k  \
    ../../lib/libboost_date_time.a ../../lib/libboost_thread.a x.cpp ...

这会导致编译器错误。通过手动将它们移动到参数列表的末尾,应用程序编译不会出错。

gcc -ggdb -Wl,-export-dynamic -Wshadow -Wno-format-y2k x.cpp ... \
    ../../lib/libboost_date_time.a ../../lib/libboost_thread.a  

是的,我尝试过更改 xml 中的顺序,这当然没有用。现在我正在使用 exec 任务以正确的顺序调用 gcc 文件,但这当然是一个 hack。

【问题讨论】:

Ant生成的gcc命令行是怎么得到的? 【参考方案1】:

尝试将带有存档的fileset 更改为libset

【讨论】:

以上是关于gcc命令行中静态库的cpptask排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在命令行中使 gcc 链接器输出节大小?

在windows命令行中如何运行c程序的文本

在gcc中定义符号常量

GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名

如何在 Linux 命令行中按大小对文件进行排序

linux命令gcc–static式啥意思