代码之家  ›  专栏  ›  技术社区  ›  Greg Nisbet

使用boost::带有clang但不使用gcc的文件系统链接的程序

  •  0
  • Greg Nisbet  · 技术社区  · 6 年前

    我有一个非常简单的程序 boost::filesystem ,摘自图书馆的教程。

    // fs_example.cpp
    #include <boost/filesystem.hpp>
    #include <iostream>
    
    using namespace boost::filesystem;
    
    int main() {
      path p = current_path();
      directory_iterator it{p};
      while (it != directory_iterator()) {
        std::cout << *it++ << '\n';
      }
    }
    

    我用以下非常简单的脚本构建它,它应该以正确的顺序为链接器提供正确的参数:

    #!/bin/sh
    
    set -u
    
    ${CXX} \
        -Wall \
        -Werror \
        --std=c++14 \
        -lboost_system \
        -lboost_filesystem \
        -o fs_example \
        fs_example.cpp
    

    使用 env CXX=clang++ ./build.sh ,程序编译并链接

    $ env CXX=clang++ ./build.sh
    $ ls
    build.sh*  fs_example*  fs_example.cpp
    

    使用 env CXX=g++ ./build.sh ,程序无法编译。

    $ env CXX=g++ ./build.sh 
    /tmp/ccFcZ3W6.o: In function `__static_initialization_and_destruction_0(int, int)':
    fs_example.cpp:(.text+0x1c1): undefined reference to `boost::system::generic_category()'
    ...
    collect2: error: ld returned 1 exit status
    

    为什么gcc在clang不是的情况下会产生链接时间错误?如何诊断链接器无法在中找到符号的原因 boost::system 在gcc路径中,即使提供了参数?

    1 回复  |  直到 6 年前
        1
  •  3
  •   John Zwinck    6 年前

    你应该假设“一次链接”意味着较低的级别 boost_system 必须出现在上级之后 boost_filesystem 是的。