使用CMake链接net-snmp库时出现未定义引用链接错误
问题
已通过MinGW按照readme.win32说明编译好net-snmp库,运行snmpdemoapp示例代码时,CMake生成正常但构建链接失败。
使用的CMake配置代码:
cmake_minimum_required(VERSION 3.18.2) project("PROJECT_NAME") INCLUDE_DIRECTORIES(C:/nsnmp/include) find_library(NETSNMPAGENT "netsnmpagent") find_library(NETSNMPMIBS "netsnmpmibs") find_library(NETSNMP "netsnmp") add_executable("${PROJECT_NAME}" Main.c) target_link_libraries("${PROJECT_NAME}" ${NETSNMPAGENT} ${NETSNMPMIBS} ${NETSNMP})
构建错误日志:
[main] Building folder: Psnmp [build] Starting build [proc] Executing command: "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe" --build c:/Users/Hanaei/Desktop/Psnmp/build --config Debug --target all -- [build] [1/1 100% :: 0.354] Linking C executable PROJECT_NAME.exe [build] FAILED: PROJECT_NAME.exe [build] cmd.exe /C "cd . && C:\msys64\mingw64\bin\gcc.exe -g CMakeFiles/PROJECT_NAME.dir/Main.c.obj -o PROJECT_NAME.exe -Wl,--out-implib,libPROJECT_NAME.dll.a -Wl,--major-image-version,0,--minor-image-version,0 C:/nsnmp/lib/libnetsnmpagent.a C:/nsnmp/lib/libnetsnmpmibs.a C:/nsnmp/lib/libnetsnmp.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ." [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(mib.o): in function `dump_realloc_oid_to_inetaddress': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/mib.c:4085: undefined reference to `__imp_ntohl' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(mib.o): in function `parse_one_oid_index': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/mib.c:3877: undefined reference to `__imp_htonl' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(parse.o): in function `compute_match': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/parse.c:1294: undefined reference to `regcomp' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/parse.c:1297: undefined reference to `regfree' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/parse.c:1296: undefined reference to `regexec' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/parse.c:1297: undefined reference to `regfree' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(snmp_api.o): in function `_sess_open': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/snmp_api.c:1699: undefined reference to `__imp_setsockopt' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(snmp_api.o): in function `snmp_add_var': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/snmp_api.c:7514: undefined reference to `__imp_inet_addr' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(asn1.o): in function `asn_parse_float': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/asn1.c:2554: undefined reference to `__imp_ntohl' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(asn1.o): in function `asn_build_float': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/asn1.c:2628: undefined reference to `__imp_htonl' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(asn1.o): in function `asn_parse_double': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/asn1.c:2745: undefined reference to `__imp_ntohl' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(asn1.o): in function `asn_build_double': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/asn1.c:2823: undefined reference to `__imp_htonl' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(asn1.o): in function `asn_realloc_rbuild_float': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/asn1.c:3859: undefined reference to `__imp_htonl' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(asn1.o): in function `asn_realloc_rbuild_double': [build] C:\Users\Hanaei\Downloads\net-snmp-5.9.3\snmplib/asn1.c:3937: undefined reference to `__imp_htonl' [build] C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/nsnmp/lib/libnetsnmp.a(system.o): in function `get_myaddr':
解决方案
链接失败是因为net-snmp依赖的系统库未被加入链接列表,需要补充以下库:
ws2_32:提供ntohl、htonl、setsockopt、inet_addr等网络相关函数regex:提供regcomp、regexec、regfree等正则表达式函数
同时建议添加库搜索路径,避免find_library无法定位net-snmp库,修改后的CMake配置代码如下:
cmake_minimum_required(VERSION 3.18.2) project("PROJECT_NAME") # 指定net-snmp库的搜索路径 link_directories(C:/nsnmp/lib) find_library(NETSNMPAGENT "netsnmpagent") find_library(NETSNMPMIBS "netsnmpmibs") find_library(NETSNMP "netsnmp") add_executable("${PROJECT_NAME}" Main.c) # 仅为当前目标添加头文件路径,符合现代CMake规范 target_include_directories("${PROJECT_NAME}" PRIVATE C:/nsnmp/include) # 链接net-snmp库及依赖的系统库 target_link_libraries("${PROJECT_NAME}" ${NETSNMPAGENT} ${NETSNMPMIBS} ${NETSNMP} ws2_32 regex )
内容的提问来源于stack exchange,提问作者Ali Assar
相关产品推荐
相关产品推荐

