7

我有一个项目,其中包括一个大型第三方库,并且需要确保该项目没有 lint-free。但是,该库有数千个错误。

修改库以删除这些不是一种选择 - 通常如何处理?

目前,代码是使用 Keil uVision 构建的,这是调用 PC-Lint 的地方,所以如果仍然是这种情况,那将是最好的。

有没有办法指定这些是库文件,因此不应分析?

谢谢。

4

1 回答 1

8

这是来自 Gimpel 网站的信息,我相信它涵盖了您正在寻找的选项(加粗以强调):

Lint 使用“库”标头的标签来指定程序员无法控制的那些标头(例如编译器标头)。默认情况下,来自外部目录或包含在 < > 中的所有#include 都被视为“库”。 这可以通过使用 +libclass 选项进行修改,并使用 +/-libdir 和 +/-libh 选项进一步微调。然后,您可以使用 -wlib 、 -elib 和 -elibsym 选项来控制仅从库头发出的那些消息。 与 PC-lint 一起分发的编译器选项文件通常包含一个 -wlib(1) 选项,该选项将来自库头的 lint 输出限制为仅错误(抑制警告和信息性消息)。

您可以在此处的 Gimpel 网站上找到更多信息。

另外,如果我没记错的话, -wlib(0) 会抑制所有库错误和警告......与上面提到的 -wlib(1) 不同。当我回到工作岗位时,我将不得不仔细检查。我没有手册的副本。

- -编辑 - -

如果它是一个选项,我会将与该库关联的所有文件放在不同的目录中。在 Keil 中,您可以转到“工具->设置 PC-Lint”。然后将新目录添加到“PC-Lint 包含文件夹”列表中。然后,您的 -wlib(0) 选项应将这些标头视为“外部”并且不返回错误。当然,您还必须修改项目设置以编译库文件。

---EDIT2添加示例---

好的,这是我试图确保我的建议可行的一个小测试。我在名为“ex_lib”的目录中创建了一个项目,并将项目命名为lib_test。在“Source Group 1”中,我创建并添加了文件“main.c”:

主程序

#include <lib_test.h>

int main (void)
{
    uint16_t x = 5;
    uint16_t y = 10;
    uint16_t total1 = 0;
    uint16_t total2 = 0;
    uint16_t total3 = 0;
    uint16_t total4 = 0;


    total1 = add(x,y);
    total2 = sub(x,y);
    total3 = mult(x,y);
    total4 = div(x,y);

    return 0;
}

然后,我创建了一个名为“library”的子目录,并在该目录中创建了第二个名为library的项目。库项目由以下文件“lib_test.h”和“lib_test.c”组成。

lib_test.h

#ifndef LIB_TEST__
#define LIB_TEST__

#include <stdint.h>

extern uint16_t add(uint16_t x, uint16_t y);
extern uint16_t sub(uint16_t x, uint16_t y);
extern uint16_t mult(uint16_t x, uint16_t y);
extern uint16_t div(uint16_t x, uint16_t y);

#endif /* LIB_TEST__ */

lib_test.c

#include "lib_test.h"

uint16_t add(uint16_t x, uint16_t y)
{
    return (x + y);
}

uint16_t sub(uint16_t x, uint16_t y)
{
    return (x - y);
}

uint16_t mult(uint16_t x, uint16_t y)
{
    return (x * y);
}

uint16_t div(uint16_t x, uint16_t y)
{
    return (x / y);
}

项目中,在“Target 'Target 1'的选项”下,我选择了“Create Library”。然后我编译了项目。

编译成功后,我回到lib_test项目,右键“Target1”,选择“Add Group”。我创建了一个名为“Library”的组,并将之前编译的“library.lib”从“library”目录添加到“Library”组中。

最后,在 Target 1 的选项下(在lib_test项目中),我转到“C/C++”选项卡并将“库”添加到“包含路径”中。然后,我能够成功编译lib_test项目(带有一些关于已设置但从未使用过的变量的警告)。在“工具->设置 PC-Lint”下,我添加了以下内容:

PC-Lint 包含文件夹:C:\Keil_ARM\RV31\INC\ 和 library\

Lint 可执行文件:C:\Lint\LINT-NT.EXE

配置文件:C:\Lint\lnt\CO-RV.LNT

我修改了 CO-RV.LNT 文件以通过修改 -wlib() 来验证我的 Lint 结果。当我使用 -wlib(0) 运行 Lint 时,我没有收到关于我的库文件的警告或错误。然后我更改了 -wlib(2) 并收到了许多关于 stdint.h 的警告。

这绝对是一个过度简化,但它应该给你一个很好的起点。此外,我收到了关于我的变量没有在“main.c”中访问的 Lint 警告,但我预料到了这一点。

于 2013-05-26T22:36:10.860 回答