为什么我会在应用程序中出现C ++未知的引用链接错误,而不是linux中的库

时间:2014-11-01 13:49:04

标签: c++ linux

现在我正在linux中基于这个库构建一个C ++动态库libabc.so和一个应用程序testlibabc.so将调用boost动态库libboost.so。我可以很好地编译libabc.so,并且找不到任何错误。如果我在ldd上使用libabc.so命令,我很容易发现这个库依赖于libboost.so。但是,当我编译应用程序test时,我有以下链接错误:

abc.so: undefined reference to `boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*)'
collect2: ld returned 1 exit status

我不知道问题出在哪里。当我编译test计划时,我确信我会将其与libabc.solibboost.so相关联。我还在链接时更改了libabc.solibboost.so的序列,以确保给出正确的库序列。有任何想法吗?谢谢。

1 个答案:

答案 0 :(得分:2)

有问题的函数被定义为采用不同的参数,具体取决于程序是编译为C ++ 03还是C ++ 11。

void boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option::enum_type, boost::system::error_code*) // pre-C++11

void boost::filesystem::detail::copy_file(boost::filesystem::path const&, boost::filesystem::path const&, boost::filesystem::copy_option, boost::system::error_code*) // C++11

在我看来,这是一个Boost错误。

因此,如果在程序中使用此函数,则必须使用C ++ 11支持编译Boost和程序,或者两者都不编译。否则程序将在链接阶段失败。

Linux中的共享库通常允许具有未解析的引用,这不会导致其链接失败。