与gcc -lnetsnmp

时间:2016-05-11 18:03:58

标签: linux gcc openssl raspberry-pi snmp

我试图在需要snmp库的raspberry pi上编译和运行我的代码。但是,我会收到错误,例如"未定义引用' EVP_DigestUpdate'"。

过去几天我一直在研究这个问题,并发现这通常发生在snmp无法找到ssl库加密时,例如,如果你之前没有指定-lcrypto -lsnmp链接对象时,或链接器无法找到-lcrypto时。

然而,在我的覆盆子pi上,我在/ usr / lib / gcc / arm-linux-gnueabihf中都有所需的库。

这就是我安装库的方式:

apt-get install libssl-dev libsnmp-dev libsnmp-base libsnmp30

我用这个命令生成trap.o:

gcc -c -g -pedantic -Wall -Wshadow -I/home/pi/tests/h -I/usr/include trap.c -o trap.o

我用这个命令链接trap.o库:

gcc -static -g -pedantic -Wall -Wshadow trap.o -o trap -L/usr/lib/arm-linux-gnueabihf/lib -lcrypto -lpthread -lnetsnmpagent -lnetsnmpmibs -lnetsnmphelpers -lnetsnmp

然后我收到了这个错误:

    gcc -static -g -pedantic -Wall -Wshadow trap.o -o trap -L/usr/lib/arm-linux-gnueabihf/lib -lcrypto -lpthread -lnetsnmpagent -lnetsnmpmibs -lnetsnmphelpers -lnetsnmp
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(system.o): In function `netsnmp_str_to_gid':
(.text+0x1144): warning: Using 'getgrnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(system.o): In function `netsnmp_str_to_gid':
(.text+0x1154): warning: Using 'endgrent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(system.o): In function `netsnmp_str_to_uid':
(.text+0x10d8): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(system.o): In function `netsnmp_str_to_uid':
(.text+0x10e8): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(system.o): In function `netsnmp_getaddrinfo':
(.text+0x4a4): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(system.o): In function `netsnmp_gethostbyaddr':
(.text+0x9f8): warning: Using 'gethostbyaddr' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
trap.o: In function `parse_address':
/home/pi/tests/trap.c:56: warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/crt1.o: In function `_start':
/build/glibc-6f8a9a/glibc-2.19/csu/../ports/sysdeps/arm/start.S:119: undefined reference to `main'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_random':
(.text+0x168): undefined reference to `RAND_bytes'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_generate_keyed_hash':
(.text+0x290): undefined reference to `EVP_md5'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_generate_keyed_hash':
(.text+0x2b4): undefined reference to `HMAC'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_generate_keyed_hash':
(.text+0x33c): undefined reference to `EVP_sha1'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_hash':
(.text+0x424): undefined reference to `EVP_sha1'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_hash':
(.text+0x42c): undefined reference to `EVP_MD_CTX_create'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_hash':
(.text+0x438): undefined reference to `EVP_DigestInit'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_hash':
(.text+0x448): undefined reference to `EVP_DigestUpdate'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_hash':
(.text+0x458): undefined reference to `EVP_DigestFinal'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_hash':
(.text+0x468): undefined reference to `EVP_MD_CTX_destroy'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_hash':
(.text+0x488): undefined reference to `EVP_md5'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_encrypt':
(.text+0x86c): undefined reference to `DES_key_sched'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_encrypt':
(.text+0x8a0): undefined reference to `DES_ncbc_encrypt'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_encrypt':
(.text+0x8c4): undefined reference to `DES_ncbc_encrypt'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_encrypt':
(.text+0x90c): undefined reference to `AES_set_encrypt_key'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_encrypt':
(.text+0x948): undefined reference to `AES_cfb128_encrypt'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_encrypt':
(.text+0xa74): undefined reference to `DES_key_sched'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_encrypt':
(.text+0xaac): undefined reference to `DES_ncbc_encrypt'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_decrypt':
(.text+0xc78): undefined reference to `AES_set_encrypt_key'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_decrypt':
(.text+0xcb0): undefined reference to `AES_cfb128_encrypt'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_decrypt':
(.text+0xd9c): undefined reference to `DES_key_sched'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(scapi.o): In function `sc_decrypt':
(.text+0xdd0): undefined reference to `DES_cbc_encrypt'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(keytools.o): In function `generate_Ku':
(.text+0x74): undefined reference to `EVP_MD_CTX_create'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(keytools.o): In function `generate_Ku':
(.text+0x98): undefined reference to `EVP_md5'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(keytools.o): In function `generate_Ku':
(.text+0xa4): undefined reference to `EVP_DigestInit'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(keytools.o): In function `generate_Ku':
(.text+0xe8): undefined reference to `EVP_DigestUpdate'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(keytools.o): In function `generate_Ku':
(.text+0x10c): undefined reference to `EVP_DigestFinal'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(keytools.o): In function `generate_Ku':
(.text+0x138): undefined reference to `EVP_MD_CTX_destroy'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(keytools.o): In function `generate_Ku':
(.text+0x178): undefined reference to `EVP_sha1'
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/libnetsnmp.a(keytools.o): In function `generate_Ku':
(.text+0x184): undefined reference to `EVP_DigestInit'
collect2: error: ld returned 1 exit status

是不是因为我安装的snmp库是使用与我环境中的openssl版本不同的openssl版本构建的?我的libssl-dev和libsnmp-dev版本如下:

dpkg -l | grep libssl-dev:

ii  libssl-dev:armhf                      1.0.1k-3+deb8u5                           armhf        Secure Sockets Layer toolkit - development files

dpkg -l | grep libsnmp-dev:

ii  libsnmp-dev                           5.7.2.1+dfsg-1                            armhf        SNMP (Simple Network Management Protocol) development files

任何帮助将不胜感激,

由于

1 个答案:

答案 0 :(得分:3)

所有未定义的引用都在libnetsnmp中,并且它们都是未定义的 对libcypto中定义的函数的引用。这是因为-lcrypto 在您的链接中位于-lnetsnmp之前。

在链接序列中,必须出现需要符号定义的文件 在提供定义的那些之前,因为默认情况下链接器会 仅搜索库以查找其具有的符号的定义 观察到在早期文件中被引用但未定义。 (你似乎 误解了这个规则,错误的方式回合)。来自man ld

  

链接器将仅在存档位置搜索一次存档   它在命令行中指定。如果存档定义了   在一些出现在之前的物体中未定义的符号   在命令行上存档,链接器将包含   存档中的相应文件。但是,一个未定义的符号   在稍后出现在命令行中的对象中不会导致   链接器再次搜索存档。

所以在-lcrypto之后链接-lnetsnmp