Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Libquantum代码理解Makefile_C++_C_Gcc_Makefile_Clang - Fatal编程技术网

C++ Libquantum代码理解Makefile

C++ Libquantum代码理解Makefile,c++,c,gcc,makefile,clang,C++,C,Gcc,Makefile,Clang,我尝试在这个c应用程序中运行名为grover.c的.c文件 www.libquantum.de/files/libquantum-1.1.1.tar.gz 现在我发现这个应用程序已经包含一个Makefile.in,我可以使用命令生成名为shor和grover的可执行文件 ./configure make make demos 但是当我尝试使用gcc或类似的方法运行grover.c时 克朗格罗弗 它给了我很多未定义函数引用的错误 在函数oracle'中: grover.c:(.text+0x5

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

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

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

./configure 
make
make demos
但是当我尝试使用gcc或类似的方法运行grover.c时

克朗格罗弗

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

在函数
oracle'中:
grover.c:(.text+0x50):对
quantum\u sigma\u x'的未定义引用 grover.c:(.text+0x89):未定义对
Quantumtoffoli'的引用
grover.c:(.text+0xc8):未定义对
quantum\u-toffoli'的引用 grover.c:(.text+0xf2):对
quantum\n的未定义引用
grover.c:(.text+0x137):未定义对
quantum\toffoli'的引用 grover.c:(.text+0x16b):未定义对
quantum\toffoli'的引用
grover.c:(.text+0x1b0):未定义对
quantum_sigma_x'的引用

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


谢谢,

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

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

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

N.B.X.Y.Z是库的版本号

一旦解决了这个问题,查找库的加载可能会出现问题,特别是在库位于非标准位置时

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

在我发布了这篇文章并上床睡觉后,我意识到我错过了一个潜在的案例(多亏了Paul Griffiths也注意到了我的疏忽……教我一次做多件事)

不管怎样,只要编译一个简单的文件,比如说hello.c,因为clanghello.c-ohhello是有效的,因为所有东西都在一个文件中,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
(或者交替使用clanggrover.c file1.c-o grover)

因此,前两行所做的是将源代码文件(grover.c和file1.c)转换为目标文件。第三行将两个对象文件覆盖到一个可执行文件中


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

我认为您误解了编译器的功能。要运行grover,只需键入
grover
,就不需要调用clang。但是当我需要编译单个C代码时,我会执行clang hello.C或gcc hello.C之类的操作,它会创建一个可执行文件。在这种情况下,我需要运行这个grover.c文件。事实上,我想在另一个软件中运行这个文件来分析它的处理器使用情况。如果你看一下makefile,你可能会看到里面有很多东西。如果您查看
clanggrover.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中的一个行连续字符)。如果你还有其他问题,尽管问。