C++ 将livemedia编译为动态库:对虚拟函数的未定义引用

C++ 将livemedia编译为动态库:对虚拟函数的未定义引用,c++,C++,我试图将livemedia库编译为一个共享对象,因此得到以下结果。因此: libBasicUsageEnvironment.so libgroupsock.so libliveMedia.so libUsageEnvironment.so 这似乎很好,但当我尝试链接这些库时,我得到了很多错误,它们使用的虚拟函数引用未定义 就我到目前为止所理解的,如果在一个类中,虚方法被定义为 class MyClass { ... virtual myMethod (int arg) {...}

我试图将livemedia库编译为一个共享对象,因此得到以下结果。因此:

  • libBasicUsageEnvironment.so
  • libgroupsock.so
  • libliveMedia.so
  • libUsageEnvironment.so
这似乎很好,但当我尝试链接这些库时,我得到了很多错误,它们使用的虚拟函数引用未定义

就我到目前为止所理解的,如果在一个类中,虚方法被定义为

class MyClass
{
   ...
   virtual myMethod (int arg) {...};
   ...
}
该方法已正确找到并链接,但如果代码在.h文件中拆分

类MyClass

{
   ...
   virtual myMethod (int arg);
   ...
}
并保存在.cpp文件中

MyClass::myMethod (int arg)
{
...
}
它不再起作用了


现在,我承认我远非C++大师,但为什么会发生这种情况呢?这是g++的一个bug吗?还是说这种语言有一些隐藏的特征?如果我将其编译为静态库,它是有效的。

可能您在链接器命令行中缺少一个-l(减去小l)开关,该开关指向包含所需符号的库。

这不是编译器错误。它表示函数定义在库
中找到。因此
而不是标题,这进一步意味着您没有正确链接。

是不是只有虚拟函数给您带来了问题?是的,我只有虚拟函数的问题。我添加了我刚刚发现的另一个问题。似乎并不是所有符号都在库中正确解析。例如,
nm.libs/libliveMedia.so | grep AMR
给出了
U znk14amraudiosource8mmetypeev
,它是缺失的符号之一,是虚拟的。所以这个问题似乎是在创造的。所以不在链接中我想我不明白你的答案。编写虚拟myMethod(int-arg);在.h文件中是否不足以定义函数?为什么我必须在.h文件中而不是在cpp文件中实现该函数?@Ottavio:不,两者都可以。但是如果您在头文件中定义了函数,那么您可能不会得到链接器错误。因此,您必须在源文件中定义它。因此,您没有正确链接已编译的源文件。或者你错误地编译了共享库。今天下午,我试图编译所有的代码,不是作为库,而是作为程序的一部分,但我仍然遇到了问题。因此,我开始认为这是一个库问题,或者是由于g++…@Ottavio:为什么每个人都这么做?首先假设这是你的错。在
g++
中,这不太可能是一个bug。