2

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


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

make clean all -C release

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

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

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

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

4

1 回答 1

1

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

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

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

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

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

于 2013-05-19T22:13:04.150 回答