如何在 UNIX 的生成文件中链接 C 程序的库文件



我使用 openssl 编写了一个解密函数,我在独立程序中对其进行了测试,它运行良好。但是这个功能是一个庞大项目的一部分,所以它必须包含在该程序中。为了执行我的独立程序,我使用了以下命令,这些命令工作正常:

cc -c aaa.c -I/usr/local/ssl/include
gcc -o aaa aaa.o -I/usr/local/ssl/include -L/usr/local/ssl/lib -lcrypto -lm
./aaa

我已经为我的主程序制作了一个生成文件,其中将调用此函数。

这两个程序单独工作正常,但是当我在程序中插入函数的定义时,它给了我那些位于openssl头文件之一(即des.h)中的变量的错误。我使用了几个类型 DES_cblock 的变量:

typedef unsigned char DES_cblock[8];

还有另一种结构具有以下定义:

typedef struct DES_ks
{
    union
    {
        DES_cblock cblock;
        DES_LONG deslong[2];
    }ks[16];
} DES_key_schedule;

我已经在我的程序中使用了这个结构,就像这样

DES_key_schedule keysched1,keysched2,keysched3;

但它没有认识到这些变量。而且由于我在执行独立程序时没有这样的错误,这意味着我无法在主程序中正确链接库文件。我该如何使这项工作。这些是我遇到的错误:

Syntax error at line 1399, column 16,file/export/home/jayesho/src/custom/FRB/tgl_frbsenddata.ec:
    Error at line 1399, column 16 in file /export/home/jayesho/src/custom/FRB/tgl_fr
bsenddata.ec
    DES_cblock hex_key1,hex_key2,hex_key3,hex_ivec,iv;
...............1
PCC-S-02201, Encountered the symbol "hex_key1" when expecting one of the followi
ng:
   ; , = : ( [ * ? | & < > + - / % . ^ *= /= %= += -= <<= >>=
   &&= ||= ^= | & == != <= >= << >> ++ -- ->
The symbol ";" was substituted for "hex_key1" to continue.
Syntax error at line 1402, column 22, file /export/home/jayesho/src/custom/FRB/tgl_frbsenddata.ec:
Error at line 1402, column 22 in file /export/home/jayesho/src/custom/FRB/tgl_fr
bsenddata.ec
    DES_key_schedule keysched1,keysched2,keysched3;
.....................1
PCC-S-02201, Encountered the symbol "keysched1" when expecting one of the follow
ing:
   ; , = : ( [ * ? | & < > + - / % . ^ *= /= %= += -= <<= >>=
   &&= ||= ^= | & == != <= >= << >> ++ -- ->
The symbol ";" was substituted for "keysched1" to continue.
Syntax error at line 1436, column 38, file /export/home/jayesho/src/custom/FRB/tgl_frbsenddata.ec:
Error at line 1436, column 38 in file /export/home/jayesho/src/custom/FRB/tgl_fr
bsenddata.ec
   if (DES_set_key_checked((C_Block *)hex_key1, &keysched1))

现在我只需要在我的程序中正确链接库文件即可使整个程序运行。前面提到的头文件是des.h,它是openssl的一部分。我尝试也通过 -lcrypto 包含加密库以前这个 des.h 没有被正确包含,但现在我成功地包含了 des.h 没有错误。有人还建议仅仅包含头文件是不够的,它的实现文件也需要链接,所以我现在想知道如何包含和链接什么?如何找出需要链接的链接的名称。

通常,使用 LDLIBS 定义链接器-l选项,并使用 LDFLAGS -L标志。 编辑生成文件并添加相应的选项。

CPPFLAGS += -I/usr/local/ssl/include 
LDFLAGS += -L/usr/local/ssl/lib 
LDLIBS += -lcrypto -lm

这些是编译器错误,您还没有进入链接阶段。

我猜想,在编译tgl_frbsenddata.ec时,编译器不知道什么是DES_cblock或DES_key_schedule。 在编译器遇到错误时,我怀疑 des.h 尚未包含在您可能相信的任何事情上,无论您是否相信。

您的编译器可能包含一个仅执行预处理的选项(在 gcc 和 clang 中,它是 -E )。 我建议您在源文件上使用该选项运行它,以查看是否出现 typedef。

最新更新