问题标签 [undefined-reference]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
758 浏览

c++ - 来自调用程序的对库类成员错误的未定义引用

下面添加的其他问题,2011 年 4 月 11 日

我正在开发一组跨平台的共享库 DLL/Sos 和 C++ 中的测试程序,尽管我必须能够支持 C。这些库将仅作为目标代码发布,但测试程序将与源代码一起发布我们的客户可以有示例代码。出于这个原因,我正在设计要在运行时加载的库,即使用 dlopen()/LoadLibraryA() 进行动态链接。

我在 Umbutu 10.04 上使用 g++ 4.4.3-4,在 Vista/64 上使用 VC++ 2008(在 32 位模式下)。

一切似乎都在 Windows 上运行良好(现在)。但是,当我在 Linux 上编译时,我遇到了一些我无法弄清楚的错误。

测试器和库有几个类,用几个 .cpp 和 .h 编码。除了主要入口点之外,库中的类和大部分内容都位于命名空间 DISCOVER_NS 中。

这是该项目的简要草图:

首先,承认,我已经缩短了一堆名字,所以代码更具可读性。

发现.cpp

  • 创建一个类对象,其指针指向它,称为 DiscoverObject 类型的 MainObject。

  • 有一个 extern "C" 函数,它将 MainObject 作为 void* 返回给调用者程序。

  • DiscoverObject 有几个方法并实例化在单独的 cpp 和 .h 中找到的其他类。一种特殊的方法名为 Hello(),它可以满足您的期望,它会打印一条“hello”测试消息。


测试器.cpp

  • 获取库的句柄

  • 获取指向返回 MainObject 的函数的函数指针。

  • 执行函数(指针)并将返回的地址从 void* 转换为 DISCOVER_NS::DiscoverObject* aDiscoverObject。

  • 运行发现对象->Hello()。


我编译:

抄送=@g++

gflags = -g3

cflags = -fPIC -Wall -pedantic

lib_linkflags := -shared -fPIC -lstdc++ -lrt -lpthread -rdynamic

tester_linkflags := -ldl -lpthread

定义 = -D_ linux _ -D_DEBUG -D_IPC_ARCH_INTEL=1 -D_THREAD_SAFE


现在,当我编译时出现以下错误: *Tester.cpp:142: undefined reference to `Discover_NS::DiscoverObject::hello()'*

我还从 discover.so 中得到了一堆其他未定义的引用错误,例如: *discover.so: undefined reference to `Discover_NS::DeviceList::~DeviceList()*


我已经尝试在 SO extern "C" 中制作几乎所有内容。没有不同。

我尝试将语句放入 find.cpp,如下所示: extern void Discover_NS::OtherClass::method( args ); 但这给了我关于“类外声明不是定义”错误的错误。


我知道查看代码会有所帮助,但我需要时间来敲出一些小东西来发布。

任何人都可以提供解决这个烂摊子的想法吗?

谢谢,

韦斯

Dmitry 的解决方案并不是解决方案的全部,而是解决方案中的一个必要元素。在检查我的 makefile 后,我发现了一些无意中重复的行,我删除了它们,以及两个“错别字”,我将 -o 的路径错误地编码到了编译步骤中。破碎的步骤编译了logger.cpp和RemException.cpp:

然后我发现了真正的错误。我完全错过了我没有在 Discover 目录中编译所有 .cpp 的事实!。删除所有 nit-pics 花了好一个小时,但现在她从 makefile 中编译出来就好了。

原始问题的新版本:现在我知道它将通过 makefile 工作,我如何让 Eclipse 做与 makefile 相同的事情?

谢谢德米特里。

韦斯

好吧,我的问题还在这里。

我的代码已根据 Dmitry (@Dmitry) 的建议进行编译。只是,它们似乎导致了一个单独的问题。我希望我的库在运行时动态链接到他的主测试程序。将-l Discover -l EdgeIO添加到链接可以编译所有内容,但它给了我静态链接。

仅供参考,未使用的“pi”是所以 SO 在其中有一个浮点数,因此将使用浮点支持进行编译。如果调用者想要使用浮点数,则需要。有人有更好的方法来强制 g++ 编译包含浮点数吗?

在修复了 Dmitry 帮助我找到的许多错误之后,我现在得到了以下输出:

我从 Eclipse 获得了相同的错误消息集。

RemKonTester.cpp 包括声明这些项目的所有 .h。我已经尝试使用声明 extern "C" 而不是它们。

希望得到帮助,

韦斯

0 投票
4 回答
471364 浏览

c - C 错误:未定义对函数的引用,但它已定义

只是一个简单的程序,但我不断收到此编译器错误。我正在使用 MinGW 作为编译器。

这是头文件point.h

这是point.c

这就是编译器问题出现的地方。我不断得到:

testpoint.c: 未定义引用'create(double x, double y)'

虽然它在 point.c 中定义。

这是一个名为testpoint.c的单独文件:

我不知道问题可能是什么。

0 投票
4 回答
76666 浏览

c - 对 SSL_library_init 和 SSL_load_error_strings 的未定义引用

我正在实现一个 OpenSSL 代码,并且已经包含了所需的头文件,但我仍然收到类似 * 的错误

未定义的引用SSL_library_init

我想这是一个链接错误而不是编译错误。

我正在使用 slickeditor 在 Linux 框中实现它。

0 投票
3 回答
1436 浏览

c++ - 缺少符号错误(未定义的引用)

我试图用 DS.h 中的声明和 DS.cpp 中的实现来定义一个类 DS 代码非常小,所以这里是清单:

和,

主要程序是:

当我尝试编译此程序时,我收到以下错误:

现在,如果我从 DS.cpp 中删除所有代码并将其粘贴到 DS.h 中,一切都可以正常编译。知道我在做什么错吗?

0 投票
5 回答
37574 浏览

qt - Qt:信号和槽错误:未定义的引用`vtable for

以下链接中的示例:http: //developer.kde.org/documentation/books/kde-2.0-development/ch03lev1sec3.html

结果是:

vtable 用于虚拟功能,AFAIK,这里出错的原因是什么?

0 投票
3 回答
812 浏览

c++ - c++中未定义的参考编译器错误

当我尝试编译我的代码时,我收到以下错误消息 -

在函数“__static_initialization_and_destruction_0”中:home/user/main.cpp:50:未定义对“PhysEng2D::PhysEng2D(void)”的引用

第 50 行的唯一代码是 -

PhysEng2D 的头文件是 -

PhysEng2D 其余部分的开始是 -

(我没有完整包含这些方法,因为我认为它们不相关)

抱歉,我知道这可能是我正在犯的一个非常愚蠢的小错误。

0 投票
2 回答
2264 浏览

g++ - 未定义对“SetTextColor@8”的引用

在 Windows 下使用 g++ 编译 c++ 程序时出现“未定义对 `SetTextColor@8' 的引用”错误。完整的错误日志在这里http://pastebin.com/DCwHKkeE 我想我错过了一些库文件但不知道哪些。请帮忙

0 投票
2 回答
211 浏览

c++ - 对本地对象的未定义引用

我在使用 nvcc 链接项目时遇到问题。它们与项目内部定义的符号一起出现。我在 cuda_bvh_constru.o 文件中定义了一些函数符号。这是相关功能的 nm 输出:

我无法弄清楚为什么链接器没有发现这些符号,因为我认为对象被正确传递了。我需要将这些对象放入特定的顺序吗?或者是别的什么?

0 投票
1 回答
716 浏览

c++ - 帮助指针和传递链表作为参数,未定义的参考 C++

我收到一条错误消息,上面写着未定义的引用

这是我尝试使用它的方式:

错误来自我尝试调用加密的地方。

这是加密功能:

就这样你可以看到类是如何在这里定义的:

我的目标是能够使用我的 encrypt 函数访问 decka 的元素。

0 投票
2 回答
146 浏览

c++ - 我收到一个未定义的引用错误,指向不存在的东西

当我尝试编译这段代码时

我收到这个错误

analysis2.cpp:13: 未定义的对 `FileParameters::FileParameters()' 的引用

为什么它给我那个未定义的参考?FileParameters 是 Analysis2 中包含的一个类,如果有帮助,Analysis2 头文件中定义了一个 FileParameters 对象。