链接clang和gcc之间的区别

时间:2016-01-04 10:36:53

标签: c++11 linker clang

我正在运行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)

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

1 个答案:

答案 0 :(得分:0)

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

如果你运行clang -V来获取版本信息,你可能会学到一些东西。另外,gcc -v获取gcc版本信息,并验证gcc clang想要的版本与您编译的版本相同。