2016-01-04 2 views
2

Я запускаю Fedora 23 и просто скомпилировал и установил casadi 2.4.1 (однако я не думаю, что это специфичный для casadi).Ссылка на разницу между clang и gcc

Я пытаюсь скомпилировать и запустить простую тестовую программу:

#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++ 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) 

Я довольно уверен, что символ -, определенный в th электронной библиотеки. Однако я не понимаю, чего здесь не хватает. Есть ли специальный флаг C++ 11 ABI, который мне нужно передать в компоновщик или что-то в этом роде?

ответ

0

Я подозреваю, что версия перекошена. Если вы не делаете что-то особенное, clang использует некоторую библиотеку gcc stdC++, для которой он ищет. Так было в прошлый раз, когда я часто использовал clang. Теперь они могут использовать собственную библиотеку std C++. Но если casadi был скомпилирован с одной версией gcc, и вы использовали clang, который использует библиотеку std C++ для другой версии gcc, вы можете увидеть ошибки компоновщика, подобные этому.

Вы можете узнать что-то, если вы запустите clang -V, чтобы получить информацию о версии. Кроме того, gcc -v для получения информации о версии gcc и убедитесь, что версия gcc clang хочет такой же, как версия, с которой вы компилируете.

Смежные вопросы