- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我构建了一个共享库,其中包含一个非模板类,我从中派生了一个链接到该库的项目中的模板类。
当我编译/链接引用项目时,我收到以下链接错误:
Undefined symbols for architecture x86_64:
"typeinfo for BaseClass", referenced from:
typeinfo for DerivedClass<int> in main.o
typeinfo
实际上指的是什么?为了更深入地挖掘,我无法找到有关它的信息。
该错误似乎暗示 BaseClass 应该具有某种类型的信息,但我不明白缺少什么。
此外,我知道此错误通常伴随着 vtable for ...
链接错误,通常是当您忘记为虚拟方法提供定义或将其定义为纯虚拟时,但我相信我在下面的 我尝试过的事情 中用 #1 排除了这一点,因为如果 foo()
,main.cpp
将不会编译' s 的定义无法从图书馆获得。
我已经将这些类提炼为以下仍然重现问题的类:
BaseClass.h(我要链接的共享库的一部分)
#ifndef BASECLASS_H_
#define BASECLASS_H_
class BaseClass
{
protected:
int myField;
public:
BaseClass();
virtual ~BaseClass() {}
virtual void foo();
};
#endif
BaseClass.cpp(编译成生成的 dylib)
#include <iostream>
#include "BaseClass.h"
__attribute__((visibility("default")))
BaseClass::BaseClass()
: myField(0)
{
}
__attribute__((visibility("default")))
void BaseClass::foo()
{
std::cout<<myField<<std::endl;
}
DerivedClass.h(在与库链接的单独项目中)
#ifndef DERIVEDCLASS_H_
#define DERIVEDCLASS_H_
#include <BaseClass.h>
template <typename T>
class DerivedClass : public BaseClass
{
protected:
T data;
public:
DerivedClass(T data) : data(data) {}
virtual ~DerivedClass() {}
};
#endif
main.cpp(表示问题的引用 DerivedClass)
#include "DerivedClass.h"
int main()
{
DerivedClass<int> derived(0);
derived.foo();
return 0;
}
共享库
编译:
g++ -O3 -Wall -c -fmessage-length=0 -fvisibility=hidden -MMD -MP -MF"src/BaseClass.d" -MT"src/BaseClass.o" -o "src/BaseClass.o" "../src/BaseClass.cpp"
链接:
g++ -Xlinker -install_name -Xlinker "@rpath/libmylibrary.dylib" -dynamiclib -o "libmylibrary.dylib" ./src/BaseClass.o
引用项目
编译:
g++ -I"/code/myproject/deps/mylibrary/include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/main.d" -MT"src/main.o" -o "src/main.o" "../src/main.cpp"
链接:
g++ -L"/code/myproject/deps/mylibrary/bin" -Xlinker -rpath -Xlinker "@loader_path" -o "myproject" ./src/InternalBaseClass.o ./src/main.o -lmylibrary
我已经做了这些事情,试图将原因缩小到具体是由于子类是模板,而基类来自共享库。
确保 BaseClass 可以被单独引用。 通过更改 main.cpp
以包含 BaseClass
并在 main()
中实例化它并调用 foo()
来测试它> 就可以了。编译和链接没有错误。
派生自内部基类而不是共享库。 通过创建一个名为 InternalBaseClass
的类进行测试,该类具有完全相同的源,除了定义文件中的 __attribute__
行,将其包含在 DerivedClass
header 中代替包含 BaseClass
,并在 DerivedClass
的类声明中将其指定为父类。编译和链接没有错误。
使 DerivedClass
成为非模板。 通过删除 DerivedClass
中的模板声明并将对参数化类型 T
的引用替换为 int
来对此进行测试。这编译和链接没有错误。
提前致谢!
最佳答案
看起来您正在使用“-fvisibility=hidden”构建共享库并使用 __attribute__((visibility("default")))
标记导出的函数,但是为了导出 RTTI,您需要使用 __attribute__((visibility("default")))
标记导出的类。来自 gcc referece :
Note that the type visibility is applied to vague linkage entities associated with the class (vtable, typeinfo node, etc.). In particular, if a class is thrown as an exception in one shared object and caught in another, the class must have default visibility. Otherwise the two shared objects are unable to use the same typeinfo node and exception handling will break.
关于c++ - 来自共享库的非模板基的模板子类导致 'class' 链接错误的 undefined symbol 类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43562659/
我只想知道它们之间的区别: .class .class{ font-size:14px; } 对比: .class > .class{ font-size:14px; } 是一样的东西吗? 最佳答案
PrimeFaces 文档的以下摘录使标题中描述的两个选择器之间似乎存在差异: .ui-widget, .ui-widget .ui-widget { font-size: 90% !imp
我正在尝试选择特定值。但我遇到了一个问题。 我有两个元素,一个有 X Y,另一个有 X Y Z。 当选择 X Y Z 时,我也收到 X Y 的值...有没有办法让它寻找 X AND Y AND Z 而
.class.class 和 .class .class 有什么区别? 最佳答案 .class .class 匹配类 .class 的任何元素,这些元素是类 .class< 的另一个元素的后代/. .
我正在研究 Classname.class 和 Classname.class.toString() 并发现了一些不寻常的东西。 .class 在同一个类上运行时似乎等同于 .class。尽管 .cl
我试图在Dart中扩展列表并在此列表中使用另一个类。 这是我的示例,其中注释出了问题: import "Radio.dart"; // extends ListBase { List ra
我有一个很大的“经理”类,我认为它做得太多了,但我不确定如何将它划分为更多逻辑单元。 一般来说类主要由以下方法组成: class FooBarManager{ GetFooEntities();
我在一个文件中定义了一个抽象父类(super class),在另一个文件中定义了一个子类。我需要父类(super class)文件和堆栈跟踪报告来找到一个包含它。 但是,当它到达“extends”行时
我在 A. Alexenderscu 的现代 C++ 设计中找到了一些模板示例 作者使用以下行的地方 template class CheckingPolicy // class SmartPt
看一下这段代码: public static class A { public void doA() { } } public static class B extends A {
我有两个具有 .body 类的 div,但是,一个位于另一个具有 .box 类的 div 中 - 如下所示: 我只想为 .box 内部的 .body 设置样式...但我在下面所
我一定是遗漏了 C++ 规范中的某些内容,因为我无法解释为什么以下代码可以成功编译: class MyClass { static void fun(); }; int main() { MyClas
我正在尝试在 python 中“模拟”命名空间。我使用内部和外部类层次结构来创建我的命名空间。例如,您希望将文件(如资源)的路径保存在一个位置。我试过这样的事情: src = #path to sou
在试验 online crystal compiler 时(这太棒了),我遇到了一个我似乎无法找到解释的错误: class Person class Current < self end
在查看我的一段代码时,我陷入了如下的一条语句。 TMyObjectClass = TMyObject 类; 我有点困惑,不知道这句话是什么意思。由于 TMyObjectClass 在该语句上方没有声明
我正在编写一个简单的应用程序,以学习一些基本的Dart编程,但无法弄清楚其结构和包含的内容-我得到了一个重复的类Point 首先,我有一个叫做MouseTrack的主类。它将初始化列表并产生循环。 #
在 org.springframework.core.SerializableTypeWrapper (版本 5.2.3),第 112 行有以下代码: if (GraalDetector.in
我希望将鼠标悬停在子导航中的列表项上,以激活页面上该类别中所有项的类(不仅仅是父元素或同级元素)。有任何想法吗?这是我的意思的一个例子: img.BLUE {border:1px solid #FF
我正在通过 ClassLoader 加载类: Class clazz = urlClassLoader.loadClass(name.substring(0, name.length() - 6).r
以下简化的类在从 get() 返回值时执行不同的操作,具体取决于该类是被赋予 double 值还是数组作为模板参数: #include "array" #include "type_traits" t
我是一名优秀的程序员,十分优秀!