在C ++中运行链接步骤时,链接器标志的顺序是否重要?

时间:2013-05-18 20:54:22

标签: linker makefile eclipse-cdt

我的原始问题如下,但它演变为以下相关问题:在链接器语句中的对象之后放置链接器标志有什么问题吗?


当我在Eclipse中构建时,运行以下链接语句:

g++ -fopenmp -lconfig++ -o "pc2" ./main.o ./sampling.o ./simulation.o

这是不正确的,因为lconfig++必须跟随,而不是在目标文件列表之前。所以,我修改了makefile,它是由Eclipse根据项目设置自动生成的。具体来说,我改变了makefile的这部分

# Tool invocations
pc2: $(OBJS) $(USER_OBJS)
    @echo 'Building target: $@'
    @echo 'Invoking: GCC C++ Linker'
    g++ -fopenmp -lconfig++ -o "pc2" $(OBJS) $(USER_OBJS) $(LIBS)
    @echo 'Finished building target: $@'
    @echo ' '

如下:

# Tool invocations
pc2: $(OBJS) $(USER_OBJS)
    @echo 'Building target: $@'
    @echo 'Invoking: GCC C++ Linker'
    g++ -o "pc2" $(OBJS) $(USER_OBJS) $(LIBS) -fopenmp -lconfig++ 
    @echo 'Finished building target: $@'
    @echo ' '

然后,在修改了makefile的1行后,我输入了

make clean all -C release

在命令行中生成以下正确的链接语句:

g++ -o "pc2" ./main.o ./sampling.o ./simulation.o -fopenmp -lconfig++

因此,我知道如何修复makefile以使构建过程正确。

我所做的知道如何配置Eclipse以便它生成的makefile将链接器标志(或“options”?)放在正确的位置。

1 个答案:

答案 0 :(得分:1)

您已回答了自己的问题:是的,链接行does matter上的对象和库的顺序。

  

有什么理由说我可能需要在目标文件之前添加链接器标志吗?

可能存在这样的链接器标志。例如--start-group GNU-ld链接器选项必须(显然)在它启动的库组之前。 --start-lib Gold链接器选项必须(显然)在构成库等的对象之前。

  

我发现我可以在设置中移动$ {FLAGS}

您可能已将-lconfig++包含在Eclipse的某个地方的${FLAGS}中,这可能是一个错误 - -lconfig++ 不是一个链接器标记(甚至虽然它看起来像一个),它是一个库规范,应该包含在${LIBS}或其他一些。