Libquantum 代码 理解 Makefile

Posted

技术标签:

【中文标题】Libquantum 代码 理解 Makefile【英文标题】:Libquantum code Understanding Makefile 【发布时间】:2014-10-06 01:06:56 【问题描述】:

我尝试在这个 C 应用程序 libquantum 中运行名为 grover.c 的 .c 文件

www.libquantum.de/files/libquantum-1.1.1.tar.gz

现在我这个应用程序已经包含了一个 Makefile.in,我可以使用命令生成名为 shor 和 grover 的可执行文件

./configure 
make
make demos

但是当我尝试使用 gcc 或这样的族群运行 grover.c 时

clang grover.c

它给了我很多未定义函数引用的错误。

在函数oracle': grover.c:(.text+0x50): undefined reference toquantum_sigma_x' grover.c:(.text+0x89): 未定义对quantum_toffoli' grover.c:(.text+0xc8): undefined reference toquantum_toffoli' 的引用 grover.c:(.text+0xf2): 未定义对quantum_cnot' grover.c:(.text+0x137): undefined reference toquantum_toffoli' 的引用 grover.c:(.text+0x16b): 未定义引用quantum_toffoli' grover.c:(.text+0x1b0): undefined reference toquantum_sigma_x'

我需要知道如何消除此错误以及是否可以在此应用程序中运行名为 grover.c 的 c 代码。

谢谢,

【问题讨论】:

我认为您误解了编译器的作用。要运行 grover,只需输入 grover,无需调用 clang。 但是当我需要编译单个 C 代码时,我会执行 clang hello.c 或 gcc hello.c 之类的操作,它会创建一个可执行文件。在这种情况下,我需要运行这个 grover.c 文件。实际上,我想在另一个软件中运行这个文件来分析它的处理器使用情况。 如果您查看makefile,您可能会在其中看到很多东西。如果您查看clang grover.c,您可能会发现缺少很多东西。这就是为什么它不适合你。您不能只从大型项目中删除单个源文件并期望能够将其转换为可执行文件。它出现在该库的项目中的事实非常强烈地表明它将使用该库中的某些功能,而您将对其保留。 【参考方案1】:

您的编译器似乎找不到一个或多个要链接的库。我的直觉是makefile 有适当的命令来调用链接器。

如果您查看您的 makefile,您可能会看到一些命令,例如 -L -l, 当-L 标志将目录添加到库的默认搜索路径,-l 标志用于命名要链接的库。

例如-L/lib/openGL -lglut32 将导致库 libglut32.so.X.Y.Z 位于目录 /lib/openGL 中。 (这不是针对 Linux 系统的,但对于 Mac 应该非常相似)。

注意X.Y.Z 是库的版本号。

解决此问题后,查找库的负载可能会出现问题,尤其是当它们位于非标准位置时。

------------------------ 编辑 ---------- ----

在我发布这篇文章并上床睡觉后,我意识到我错过了一个潜在的案例(感谢 Paul Griffiths 也注意到我的遗漏.....教我一次做多件事)。

无论如何,只要编译一个简单的文件,比如 hello.c,因为 clang hello.c -o hello 可以工作,因为所有内容都在一个文件中,并且 clang 将自动链接到 C 运行时库。

如果在您的情况下代码分布在多个文件中,例如 grover.c 和 file1.c,您需要这样做:

clang -c grover.c -o grover.o
clang -c file1.c -o file1.o
clang grover.o file1.o -o grover

(或者或者 clang grover.c file1.c -o grover)

所以前两行所做的是将源代码文件(grover.c 和 file1.c)转换为目标文件。第三行将两个目标文件包含在一个可执行文件中。

最后,这两种情况都可以涉及。您可能有多个文件以及缺少库。

【讨论】:

很可能grover.c 只是构成应用程序grover 的众多源文件之一,仅仅链接库是不够的。 我可以在 make 文件 grover 中使用这些信息吗: libquantum.la grover.c Makefile $(LIBTOOL) --mode=link $(CC) $(CFLAGS) -o grover grover.c - I./ \ -lquantum -static -lm 给 GCC 适当的命令以生成可执行文件? @jav321 是的。 makefile 只不过是一个驱动 GCC 的脚本(稍微简化)。您需要做的是确定变量 CC 和 CFLAGS 包含的内容。从历史上看,变量 CC 包含编译器名称(在您的情况下,我猜它可能是 gcc),并且 CFLAGS 包含传递给编译器的标志和选项。 -I./ -lquantum -static -lm 行的其余部分将按原样使用(我认为您评论中的 \ 是 makefile 中的行继续符)。如果您有任何其他问题,请尽管提问。

以上是关于Libquantum 代码 理解 Makefile的主要内容,如果未能解决你的问题,请参考以下文章

Makefile 解释。理解别人的 Makefile

深入理解linux源码安装三板斧

make命令回显Makefile执行脚本命令

我对 MAKE 的理解正确吗?

Makefile学习13——理解make的解析行为

Makefile