2016-01-04 64 views
2

我正在運行fedora 23,剛剛編譯安裝了casadi 2.4.1(不過,我不認爲這是casadi特定的)。叮噹與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編譯的,而你使用的是使用std C++庫作爲另一個gcc版本的clang,你可以看到像這樣的鏈接器錯誤。

如果你運行clang -V來獲取版本信息,你可能會學到一些東西。此外,gcc -v獲取gcc版本信息,並驗證gcc clang所需的版本與您正在編譯的版本相同。

相關問題