gpt4 book ai didi

c++ - 在 C/C++ 项目中定位 "undefined"引用

转载 作者:太空狗 更新时间:2023-10-29 12:11:23 25 4
gpt4 key购买 nike

我正在使用提供的 Makefile 在我的 Ubuntu 64 位系统上构建一个 C++ 项目,并且这个项目还为开发者提供了一个 API 库。

编译成功,完全没有错误,但是当我尝试在我的文件中包含“api”文件夹中提供的 API 库时,然后 g++提示 undefined reference

这不是依赖关系的问题(我已经成功构建了项目),实际上缺少的引用是关于项目提供的类和函数的,但它们在一些特定的(子)文件夹中(我没有知道哪些!),我猜在某些 .so 文件g++ 中找不到它们,可能是因为它不知道它们在那些特定的子文件夹中。

这不是第一次尝试使用来自任何项目的 API 时发生这种情况,然后我想我在尝试使用一个项目。

特别是,主要问题是我不知道如何告诉编译器某些类或数据结构的声明位置,而且我不知道如何定位 他们是为了知道他们在哪里。

通常,我用来避免此问题的解决方法是运行 make install (作为 root 或使用 sudo )以便将库和 API 安装在标准文件夹中(如 /usr/include/usr/lib ),如果我这样做,我可以使用 #include <library> 包含 API 库, 但在最后一种情况下它也不起作用,因为可能包含未找到的类/结构的某些必需文件未正确安装在系统的正确文件夹中。

我有时使用的另一种解决方法是尝试将所有项目文件放在同一个文件夹中,而不是使用项目文件夹结构,但显然这并不好! :-)

但我注意到其他几个人设法使用了 API,显然他们知道找到包含“未定义”引用的文件并将它们包含在编译中的方法。

那么我的一般问题是: 给定一个基于“Makefile”文件的“经典”C++ 项目以及常用文件夹名称,如 src , lib , build , bin等,如果我想使用项目提供的库编写 C++ 文件,但编译器提示 undefined reference ,如何找到包含此类引用的文件(.so 或 .o 或 .cpp)? 有什么工具可以找到它们吗? 我如何告诉编译器它们在哪里?我应该为 g++ 使用一些命令行选项吗?或者我应该使用 #include以某种聪明的方式宏?

PS 我也尝试使用 pkc-config linux 工具来获取用于编译的正确选项并且它们可用,但编译器仍然提示 undefined reference 。

关于我尝试的项目的更多细节:

对于感兴趣的人,该项目的链接如下: https://github.com/dreal/dreal3

以及关于如何构建它的说明: http://dreal.github.io/download/

最佳答案

查看 -rpath 链接器选项 - 特别是使用“$ORIGIN”参数。这使您可以找到与可执行文件位置相关的库,因此您不必将它们安装到标准位置,而只需将它们放在已知的、相对于可执行文件的位置。这应该可以帮助您解决其中的一个难题。

注意:-Wl, 可用于通过 g++ 将参数传递给链接器。

至于将编译器/链接器指向一个库,以便它可以使用该库解析 undefined reference ,请使用 -l(小写的 L)选项指定库名称和 -L 指定搜索库的目录。

至于查看库 (.so) 文件以查看其中有哪些符号,您可以使用一些工具:objdumpnmreadelfobjcopy

关于c++ - 在 C/C++ 项目中定位 "undefined"引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44264931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com