【问题标题】:Linking difference between clang and gcc连接clang和gcc的区别
【发布时间】:2016-04-07 22:51:26
【问题描述】:

我正在运行 fedora 23,并且刚刚编译并安装了 casadi 2.4.1(但是,我认为这不是 casadi 特定的)。

我正在尝试编译并运行一个简单的测试程序:

#include <iostream>

#include <casadi/casadi.hpp>

using namespace casadi;

int main () {
  const SX m(42);

  const SX n(23);

  const SX x = m + n ;

  std::cout << x << std::endl;
}

在 gcc 上运行良好:

$ g++ test.cpp -std=c++11 -I$HOME/local/include -L$HOME/local/lib -lcasadi && ./a.out
SX(65)

但是使用 clang,我得到一个链接器错误:

$ clang++ test.cpp -std=c++11 -I$HOME/local/include -L$HOME/local/lib -lcasadi && ./a.out
/tmp/test-cde41f.o: In function `casadi::GenericMatrix<casadi::Matrix<casadi::SXElement> >::dimString() const':
test.cpp:(.text._ZNK6casadi13GenericMatrixINS_6MatrixINS_9SXElementEEEE9dimStringEv[_ZNK6casadi13GenericMatrixINS_6MatrixINS_9SXElementEEEE9dimStringEv]+0x2b): undefined reference to `casadi::Sparsity::dimString() const'
/tmp/test-cde41f.o: In function `void casadi::Sparsity::set<casadi::SXElement>(casadi::SXElement*, casadi::SXElement const*, casadi::Sparsity const&) const':
test.cpp:(.text._ZNK6casadi8Sparsity3setINS_9SXElementEEEvPT_PKS3_RKS0_[_ZNK6casadi8Sparsity3setINS_9SXElementEEEvPT_PKS3_RKS0_]+0x6f0): undefined reference to `casadi::Sparsity::dimString() const'
test.cpp:(.text._ZNK6casadi8Sparsity3setINS_9SXElementEEEvPT_PKS3_RKS0_[_ZNK6casadi8Sparsity3setINS_9SXElementEEEvPT_PKS3_RKS0_]+0x743): undefined reference to `casadi::Sparsity::dimString() const'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我非常有信心在库中定义了符号 。但是,我不明白这里缺少什么clang。是否有一些特殊的 c++11 ABI 标志需要传递给链接器或类似的东西?

【问题讨论】:

    标签: c++11 linker clang


    【解决方案1】:

    我会怀疑版本偏差。除非你做一些特别的事情,否则 clang 会使用一些 gcc stdc++ 库来搜索它。这是我最后一次使用clang的情况。他们现在可以使用自己的 std c++ 库。但是,如果 casadi 是用一个版本的 gcc 编译的,而您使用的 clang 将 std c++ 库用于另一个版本的 gcc,您会看到像这样的链接器错误。

    如果你运行 clang -V 来获取版本信息,你可能会学到一些东西。还有,gcc -v 获取gcc版本信息,验证gcc clang想要的版本和你编译的版本是一样的。

    【讨论】:

      猜你喜欢
      • 2015-08-13
      • 2016-08-01
      • 2019-09-28
      • 2015-12-07
      • 2013-12-30
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多