我的原始问题如下,但它演变为以下相关问题:在链接器语句中的对象之后放置链接器标志有什么问题吗?
当我在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”?)放在正确的位置。
答案 0 :(得分:1)
您已回答了自己的问题:是的,链接行does matter上的对象和库的顺序。
有什么理由说我可能需要在目标文件之前添加链接器标志吗?
可能井存在这样的链接器标志。例如--start-group
GNU-ld链接器选项必须(显然)在它启动的库组之前。 --start-lib
Gold链接器选项必须(显然)在构成库等的对象之前。
我发现我可以在设置中移动$ {FLAGS}
您可能已将-lconfig++
包含在Eclipse的某个地方的${FLAGS}
中,这可能是一个错误 - -lconfig++
不是一个链接器标记(甚至虽然它看起来像一个),它是一个库规范,应该包含在${LIBS}
或其他一些。