现在我正在linux中基于这个库构建一个C ++动态库libabc.so
和一个应用程序test
。 libabc.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.so
和libboost.so
相关联。我还在链接时更改了libabc.so
和libboost.so
的序列,以确保给出正确的库序列。有任何想法吗?谢谢。
答案 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中的共享库通常允许具有未解析的引用,这不会导致其链接失败。