即使在链接之后也可以将“Undefined Reference”提升到系统

时间:2012-08-26 19:35:12

标签: c++ eclipse boost eclipse-cdt

我在eclipse cdt windows中包含了以下库。

  
      
  1. libboost_filesystem-VC100-MT-1_51
  2.   
  3. libboost_system-VC100-MT-1_51
  4.   

从律师输出(贝娄)的顶部,他们似乎连接得很好。然而,我得到以下错误。

律师输出/错误:

18:10:00 **** Incremental Build of configuration Debug for project Boost ****
Info: Internal Builder is used for build
g++ "-LC:\\Users\\Mike\\Desktop\\Lib\\boost_1_51_0\\stage\\lib" -o Boost.exe "src\\Boost.o" -llibboost_filesystem-vc100-mt-1_51 -llibboost_system-vc100-mt-1_51 
src\Boost.o: In function `_static_initialization_and_destruction_0':
C:/Users/Mike/Desktop/Lib/boost_1_51_0/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
C:/Users/Mike/Desktop/Lib/boost_1_51_0/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
C:/Users/Mike/Desktop/Lib/boost_1_51_0/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
src\Boost.o: In function `ZN5boost10filesystem9file_sizeERKNS0_4pathE':
C:/Users/Mike/Desktop/Lib/boost_1_51_0/boost/filesystem/operations.hpp:447: undefined reference to `boost::filesystem::detail::file_size(boost::filesystem::path const&, boost::system::error_code*)'
src\Boost.o: In function `path<char [9]>':
C:/Users/Mike/Desktop/Lib/boost_1_51_0/boost/filesystem/path.hpp:139: undefined reference to `boost::filesystem::path::codecvt()'
src\Boost.o: In function `ZN5boost10filesystem11path_traits8dispatchISbIwSt11char_traitsIwESaIwEEEEvRKSsRT_RKSt7codecvtIwciE':
C:/Users/Mike/Desktop/Lib/boost_1_51_0/boost/filesystem/path_traits.hpp:174: undefined reference to `boost::filesystem::path_traits::convert(char const*, char const*, std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&, std::codecvt<wchar_t, char, int> const&)'
collect2: ld returned 1 exit status

似乎系统库没有正确连接/链接。

我的代码:

#include <boost/filesystem.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>

int main()
{
    using namespace boost::filesystem;
    file_size("test.txt");
    return 0;

}

我错过了什么吗?我需要包含其他内容吗?

1 个答案:

答案 0 :(得分:3)

每个C ++编译器都有自己的规则和函数名称修改的实现(将C ++函数名转换为ASM或C函数)。
例如,MSVC将boost :: system :: generic_category转换为?generic_category @ system @ boost @@ YAABVerror_category @ 12 @ XZ,但在这种情况下,您使用的是使用MSVC2010(vc100)构建的DLL和eclipse g ++编译器修改名称的规则,因此它期望在库中找不到的其他内容,并且它会生成链接器错误
作为一般规则,使用从您在项目中使用的编译器编译的DLL中的C ++对象是不合法的,甚至使用使用先前版本的编译器编译的DLL也是不合法的。是因为将vc100添加到其DLL名称以通知您只应将其与vc100(MSVC2010)一起使用