这可能看起来有点愚蠢:)但这已经困扰了一段时间了。当我在我的C++/C程序中包含一些别人编写的头文件时,编译器如何知道头文件中声明的类成员函数的实现在哪里?
假设我想编写一些利用 OpenCV 库的程序。通常我想使用:
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
然而,据我所知,这些只是头文件,仅声明函数但没有实现。那么编译器如何知道去哪里找到实现呢?特别是当我想构建 .so 文件时。
有一个类似的帖子。 https://stackoverflow.com/questions/9687541/including-header-files-when-theres-no-implementation-file基本上它说的是第三方库,特别是。商业产品不发布源代码,因此它们随标头一起提供 lib 文件。但是,它并没有明确编译器如何知道在哪里可以找到 lib 文件。另外,那篇文章中的答案提到,如果我想编译自己的代码,我需要这些头文件的实现的源代码。这是否意味着我无法在没有实现源的情况下构建 .so 文件?
一般来说,执行分布为以下形式预编译图书馆。您需要告诉编译器它们所在的位置。
例如,对于gcc
,引用在线手册 https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
-llibrary
-l library
搜索名为的库library链接时。 [...]
and,
-Ldir
添加目录dir到要搜索的目录列表-l
.
注意:您不需要显式指定标准库,它们会自动链接。相反,如果你不想要它们与您的二进制文件链接,您需要通过传递来通知编译器-nostdlib
option.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)