制作库并避免链接器问题

Making libraries and avoiding linker issues

本文关键字:链接 问题      更新时间:2023-10-16

我有大约十几个函数都与同一目的有关,我正在尝试创建一个库。一个我可以存储在某个目录中的库,然后我可以将其作为包含目录,并在需要使用的项目中包含所述库。


旁注:

首先,我想说,我已经花了相当多的时间来寻找答案。当我意识到当我将库包含在多个源文件中时,链接器会抛出错误时,我以为我找到了解决方案。现在我知道了这一点,我再次为自己的不幸寻找答案。我开始研究其他我知道可以做同样事情的库,或者我相信可以做同样的事情的库。我一直在研究conio.h,因为它包含了kbhit()和getch()函数。虽然我不明白其中的大部分内容,但我搜索了几个关键词,发现它实际上可能包括通过dll的函数定义。

我还做了一些谷歌搜索。


来解释一下我在做什么。我创建了2或3个数据结构,使我能够创建带有标头的数据块,这些标头指定数据是什么以及如何处理数据。然后还有几个用于读取和将这些块写入文件。

为了便于创建这些结构,我制作了独立的函数。为了便于操作这些结构,我制作了更多独立的函数。

简单地说,我需要一种方法来包含一个以某种方式直接或间接定义所有这些函数和结构的库。我该怎么做 (不创建大量内联)

您可以使用#pragma comment 在代码中包含.lib依赖项

#pragma comment (lib,"LibraryFileName.lib")

你可以在这里阅读更多关于#pragma comment的信息。

我通常喜欢在我的库中创建一个Linker.h文件,并将该文件包含在库中的每个标头中。这是一个例子。

#ifndef __GRAPHICCOMMUNICATOR_GUARD_linklib__
#define __GRAPHICCOMMUNICATOR_GUARD_linklib__
#if defined(_DEBUG)
    #pragma comment (lib,"GraphicCommunicator-mt-d.lib")
#elif !defined(_DEBUG)
    #pragma comment (lib,"GraphicCommunicator-mt.lib")
#else
    #error link: no suitable library
#endif
#endif // __GRAPHICCOMMUNICATOR_GUARD_linklib__

将所有内容放在一个标头中会导致问题。
您可以将类成员函数以内联或其他内联函数的形式定义在头中,并多次包含它们。

否则,您需要将实现移动到cpp文件中,并构建一个静态(或动态)库。如果你正在学习,静态可能更容易。创建一个新项目并从应用程序设置中选择"静态库"。

要使用库,您可以使用Caeser的#pragma答案,或者只需将.lib添加到希望使用它的项目中的链接器设置中,以及#including所需的标头。