我已经使用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
我为我的主程序制作了一个makefile,其中将调用此函数。
这两个程序都可以单独运行,但是当我在程序中的函数中插入定义时,它给了我在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而没有错误。 有人还建议仅包含头文件是不够的,其实现文件也需要linked,所以我现在想知道如何包含和链接什么? 如何找出需要链接的链接名称。
答案 0 :(得分:1)
通常,您使用LDLIBS为链接器定义-l
选项,使用LDFLAGS定义-L
标志。编辑Makefile并添加适当的选项。
CPPFLAGS += -I/usr/local/ssl/include
LDFLAGS += -L/usr/local/ssl/lib
LDLIBS += -lcrypto -lm
答案 1 :(得分:0)
这些是编译器错误,你还没有进入链接阶段。
我猜想,在编译tgl_frbsenddata.ec时,编译器不知道DES_cblock是什么或DES_key_schedule。在编译器遇到错误行的那一点上,我怀疑des.h还没有被包括在你可能相信的是否有你的内容中。
您的编译器可能包含仅进行预处理的选项(在gcc和clang中,它是-E
)。我建议你在源文件中使用该选项运行它,看看是否出现了typedef。