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

Linker 在C+;中运行链接步骤时,链接器标志的顺序是否重要+;?,linker,makefile,eclipse-cdt,Linker,Makefile,Eclipse Cdt,我最初的问题如下,但它演变为以下相关问题:将链接器标志放在链接器语句中的对象之后有什么问题吗? 在Eclipse中构建时,将运行以下链接语句: g++-fopenmp-lconfig++-o“pc2”。/main.o./sampling.o./simulation.o 这是不正确的,因为lconfig++必须在对象文件列表之后,而不是之前。因此,我修改了makefile,它是由Eclipse根据项目设置自动生成的。具体来说,我更改了makefile的这一部分 # Tool invocation

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


在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的那一行之后,我输入了

makeclean all-C发布

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

g++-o“pc2”。/main.o./sampling.o./simulation.o-fopenmp-lconfig++

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


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

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

是否有任何原因需要在对象文件之前使用链接器标志

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

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


您可能在Eclipse中的某个地方将
-lconfig++
包含在
${FLAGS}
中,这很可能是一个错误--
-lconfig++
不是链接器标志(尽管它看起来像链接器标志),它是一个库规范,可能应该包含在
${LIBS}
或类似的内容中。

发布此问题后,我发现我可以将设置>链接器>“命令行模式”中的
${FLAGS}
移动到模式规范的末尾。这解决了问题。但是,它提出了一个问题:是否有任何理由需要在对象文件之前使用链接器标志?