C 在Windows上构建MQTT Paho的未定义符号

C 在Windows上构建MQTT Paho的未定义符号,c,msbuild,openssl,paho,windows64,C,Msbuild,Openssl,Paho,Windows64,我正在尝试在Windows X86(64位)上构建paho_mqtt.c。我正在使用Visual Studio Community 2013。这是一个受支持的配置 要为64位构建paho_mqtt.c,需要为Windows 64位编译OpenSSL。为了构建OpenSSL,我发现我需要一个新版本的activeperl。然后,我使用以下命令构建OpenSSL: perl配置-无asm VC-WIN64A 恩马克 nmake测试 所有的测试都成功了,所以我相信我有可用的SSL/TLS库 构建MQ

我正在尝试在Windows X86(64位)上构建
paho_mqtt.c
。我正在使用Visual Studio Community 2013。这是一个受支持的配置

要为64位构建
paho_mqtt.c
,需要为Windows 64位编译OpenSSL。为了构建OpenSSL,我发现我需要一个新版本的activeperl。然后,我使用以下命令构建OpenSSL:

  • perl配置-无asm VC-WIN64A
  • 恩马克
  • nmake测试
所有的测试都成功了,所以我相信我有可用的SSL/TLS库

构建MQTT paho时,它找不到
ssl.h
。我使用了下面列出的页面上的技巧来设置环境变量,以便msbuild从环境变量获取包含路径:

这起了作用,泛美卫生组织发现了ssl.h

paho.mqtt.c的下一个msbuild未能找到libeay32/ssleay32.dll。首先,我再次使用上面的技巧,以便msbuild在正确的目录中搜索openssl库。虽然新的库可以工作,但库名称不同。我在上使用了2)中的信息,并执行了以下操作:

cp libssl.lib libeay32.lib
cp libcrypto.lib ssleay32.lib
我知道这是可疑的,但它似乎起了作用;也就是说,失败的link命令现在运行时没有警告或错误。但它可能只是将任何未解决的符号问题推迟到以后

稍后尝试链接可执行文件时,msbuild失败(如本文底部所示)。msbuild抱怨无法解析MQTTClient_*函数/符号(例如MQTTClient_uConnect)。这些函数都在MQTTClient.c和msbuild构建的MQTTClient.obj中,不会发出任何错误

我的问题围绕着“真正的问题是什么?”

  • MQTTClient.obj的问题是:
    • 可能它没有包含在link命令中
    • 或者可能符号不在对象文件中
  • 问题是我重命名了这些库
msbuild未报告找不到MQTTClient.obj。 如果问题出在openssl库上,我希望它会报告未找到某些openssl符号

在linux上,我将使用nm-g查看未定义的符号是否在MQTT_Client.obj中。如何在Windows中验证这一点

谢谢你能提供的帮助



您的link命令缺少
libeay32.lib
ssleay32.lib
的OpenSSL导入库
MQTTClient_create
不是来自OpenSSL,您也需要该库。您应该找到库
MQTTClient\u create
和朋友是其中的一部分,并添加(1)库名称(如果是静态链接);或者(2)
/implib:XXX
,如果它是动态链接的。另请参见MSDN。如果不使用msbuild,我已经在Visual Studio Community 2013中打开了解决方案,并将C:\msys64\usr\local\ssl\lib添加到属性/库目录中(对于dll,添加…\bin)。Visual Studio仍在报告“错误链接1181:无法打开输入文件”libeay32.lib“)为什么?它找不到吗?文件有问题吗?$ls-l C:/msys64/usr/local/ssl/lib/libeay32.lib-rw-r--r--1 CRC None 802648 Jul 20 15:51 C:/msys64/usr/local/ssl/lib/libeay32.lib$文件!$C:/msys64/usr/local/ssl/lib/libeay32.lib:当前ar Archivegr。似乎我在属性中的错误位置添加了该路径。将它添加到Linker->General->Additional Library目录似乎让我有所收获。因此,如果有人编写包含.c文件的代码,要使用Visual Studio构建它,需要将.c文件的路径添加到Properites->VC++目录->Include目录。
Link:
  C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\amd64\link.exe /ERRORREPORT:QUEUE /OUT:"C:\Users\don\paho.mqtt.c\Windows Build\x64\Release\paho-cs-pub.exe" /INCREMENTAL:NO /NOLOGO /LIBPA
  TH:"C:\Users\don\paho.mqtt.c\Windows Build\\x64\Release" "paho-mqtt3a.lib" kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc3
  2.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:\Users\don\paho.mqtt.c\Windows Build\x64\Release\paho-cs-pub.pdb" /SUBSYSTEM:CONSOLE /O
  PT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\don\paho.mqtt.c\Windows Build\x64\Release\paho-cs-pub.lib" /MACHINE:X64 x64\Release\paho_cs_pub.obj
paho_cs_pub.obj : error LNK2001: unresolved external symbol MQTTClient_create [C:\Users\don\paho.mqtt.c\Windows Build\stdoutsuba\stdoutsuba.vcxproj]
paho_cs_pub.obj : error LNK2001: unresolved external symbol MQTTClient_yield [C:\Users\don\paho.mqtt.c\Windows Build\stdoutsuba\stdoutsuba.vcxproj]
paho_cs_pub.obj : error LNK2001: unresolved external symbol MQTTClient_setCallbacks [C:\Users\don\paho.mqtt.c\Windows Build\stdoutsuba\stdoutsuba.vcxproj]
paho_cs_pub.obj : error LNK2001: unresolved external symbol MQTTClient_disconnect [C:\Users\don\paho.mqtt.c\Windows Build\stdoutsuba\stdoutsuba.vcxproj]
paho_cs_pub.obj : error LNK2001: unresolved external symbol MQTTClient_publish [C:\Users\don\paho.mqtt.c\Windows Build\stdoutsuba\stdoutsuba.vcxproj]
paho_cs_pub.obj : error LNK2001: unresolved external symbol MQTTClient_destroy [C:\Users\don\paho.mqtt.c\Windows Build\stdoutsuba\stdoutsuba.vcxproj]
paho_cs_pub.obj : error LNK2001: unresolved external symbol MQTTClient_connect [C:\Users\don\paho.mqtt.c\Windows Build\stdoutsuba\stdoutsuba.vcxproj]
C:\Users\don\paho.mqtt.c\Windows Build\x64\Release\paho-cs-pub.exe : fatal error LNK1120: 7 unresolved externals [C:\Users\don\paho.mqtt.c\Windows Build\stdoutsuba\stdoutsuba.vcxproj]