【问题标题】:Does order of linker flags matter when running linking step in C++?在 C++ 中运行链接步骤时,链接器标志的顺序是否重要?
【发布时间】:2013-05-18 20:54:21
【问题描述】:

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


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

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

这是不正确的,因为lconfig++ 必须在目标文件列表之后,而不是之前。因此,我修改了 Eclipse 根据项目设置自动生成的 makefile。具体来说,我更改了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 将链接器标志(或“选项”?)放置在正确的位置。

【问题讨论】:

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

标签: linker makefile eclipse-cdt


【解决方案1】:

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

有什么理由我可能需要链接器标志来位于目标文件之前?

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

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

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

【讨论】:

    猜你喜欢
    • 2022-08-04
    • 1970-01-01
    • 2014-10-18
    • 2011-08-14
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多