gpt4 book ai didi

c++ - 为什么更改链接顺序可以修复一个系统上的一些链接错误?

转载 作者:行者123 更新时间:2023-11-30 02:21:33 25 4
gpt4 key购买 nike

所以我在 GitLab CI 上有这种奇怪的行为。我让它工作了,但现在我想知道为什么它会工作。

首先,我开始使用 GitLab CI。我在我的机器 (Arch Linux) 上安装了一个带有 docker 的本地运行器,这样我就可以在不推送和等待的情况下进行测试。我用 googletest 框架写了一个测试(只是一个 assert true)。我在本地触发了脚本,一切正常。所有测试都在本地 docker 镜像中通过。

所以现在,当一切正常时,我推送到存储库,一个运行器接手了这项工作。这在 Ubuntu 16.04 上运行。现在它编译并在执行后抛出段错误。

我在 Ubuntu 系统上进行了调试,过了一会儿我切换了两个库的链接顺序:

来自:

target_link_libraries(${PROJECT_NAME}_test PRIVATE Threads::Threads -lglog -lpthread
${QT_LIBRARIES}
${PROJECT_BINARY_DIR}/googletest-build/googlemock/libgmock.a
${PROJECT_BINARY_DIR}/googletest-build/googlemock/gtest/libgtest.a
${OpenCV_LIBRARIES}
)

收件人:

target_link_libraries(${PROJECT_NAME}_test PRIVATE Threads::Threads -lglog -lpthread
${QT_LIBRARIES}
${OpenCV_LIBRARIES}
${PROJECT_BINARY_DIR}/googletest-build/googlemock/libgmock.a
${PROJECT_BINARY_DIR}/googletest-build/googlemock/gtest/libgtest.a
)

我正在使用 CMake 进行构建。

两台 PC 都运行相同版本的 docker (17.12.0-ce)。

使用的gcc docker镜像是:sha256:95d81930694ca9e705b71dc141ddd13f466f4989857f74aebaf1d29ba6553775

显然这个问题是有关联的: Why does the order in which libraries are linked sometimes cause errors in GCC?

现在我的问题是:当两个系统都运行 docker 容器时。为什么在这种情况下更改链接顺序可以解决问题?

最佳答案

依赖关系。文件的顺序很重要。

链接器一次处理一个静态库,解析丢失的符号并将它们拉入正在创建的可执行文件中。

因此,如果静态库 (*.a) 依赖于另一个静态库,则它必须出现在满足其缺失符号的静态库之前。

目标文件 (*.o) 是“批发”消费的,因此订购它们并不麻烦。

关于c++ - 为什么更改链接顺序可以修复一个系统上的一些链接错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48153384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com