gpt4 book ai didi

c++ - 静态库链接失败

转载 作者:可可西里 更新时间:2023-11-01 10:45:50 25 4
gpt4 key购买 nike

我的操作系统是 Windows 7 Ultimate,x64。我使用 cmake、Visual Studio 12.0 编译了库 ( https://github.com/mfontanini/libtins)。输出是 tins.lib。依赖项:Winpcap、IHPlpapi.lib 和 WS2_32.lib。 Winpcap 似乎是单独工作的,我得到了 C:\libtins\Include 中的所有包含文件,以及 C:\libtins 中除 winpcap 之外的所有 .lib 文件。 main.cpp 源代码取自库示例。我无法理解问题出在哪里,似乎无法读取某些功能。以下源代码的编译器是 Qt Creator。

为什么库无法与 Qt Creator 链接?此外,修复此错误的解决方案是什么?

Qt工程文件是这样的:

QT       += core
QT -= gui

TARGET = libtins_test
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += C:/WpdPack/Include
INCLUDEPATH += C:/libtins/Include
LIBS += -LC:/WpdPack/Lib/x64 -lwpcap -lpacket
LIBS += -LC:/libtins -lws2_32 -liphlpapi -ltins

main.cpp 是这样的:

#include <tins/tins.h>
#include <map>
#include <iostream>
#include <functional>
#include <QCoreApplication>

using namespace Tins;

class arp_monitor {
public:
void run(Sniffer &sniffer);
private:
bool callback(const PDU &pdu);

std::map<IPv4Address, HWAddress<6>> addresses;
};

void arp_monitor::run(Sniffer &sniffer)
{
sniffer.sniff_loop(
std::bind(
&arp_monitor::callback,
this,
std::placeholders::_1
)
);
}

bool arp_monitor::callback(const PDU &pdu)
{
// Retrieve the ARP layer
const ARP &arp = pdu.rfind_pdu<ARP>();
// Is it an ARP reply?
if(arp.opcode() == ARP::REPLY) {
// Let's check if there's already an entry for this address
auto iter = addresses.find(arp.sender_ip_addr());
if(iter == addresses.end()) {
// We haven't seen this address. Save it.
addresses.insert({ arp.sender_ip_addr(), arp.sender_hw_addr()});
std::cout << "[INFO] " << arp.sender_ip_addr() << " is at "
<< arp.sender_hw_addr() << std::endl;
}
else {
// We've seen this address. If it's not the same HW address, inform it
if(arp.sender_hw_addr() != iter->second) {
std::cout << "[WARNING] " << arp.sender_ip_addr() << " is at "
<< iter->second << " but also at " << arp.sender_hw_addr()
<< std::endl;
}
}
}
return true;
}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
/*
if(argc != 2) {
std::cout << "Usage: " << *argv << " <interface>\n";
return 1;
}*/
arp_monitor monitor;
// Sniffer configuration
SnifferConfiguration config;
config.set_promisc_mode(true);
config.set_filter("arp");

// Sniff on the provided interface in promiscuous mode
Sniffer sniffer("eth0", config);

// Only capture arp packets
monitor.run(sniffer);
return a.exec();
}

编译输出(Qt Creator):

03:13:11: Running steps for project libtins_test...
03:13:11: Configuration unchanged, skipping qmake step.
03:13:11: Starting: "C:\Qt\Tools\QtCreator\bin\jom.exe"
C:\Qt\Tools\QtCreator\bin\jom.exe -f Makefile.Debug
echo 1 /* CREATEPROCESS_MANIFEST_RESOURCE_ID */ 24 /* RT_MANIFEST */ "debug\\libtins_test.exe.embed.manifest">debug\libtins_test.exe_manifest.rc
if not exist debug\libtins_test.exe if exist debug\libtins_test.exe.embed.manifest del debug\libtins_test.exe.embed.manifest
if exist debug\libtins_test.exe.embed.manifest copy /Y debug\libtins_test.exe.embed.manifest debug\libtins_test.exe_manifest.bak
link /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /SUBSYSTEM:CONSOLE "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /MANIFEST /MANIFESTFILE:debug\libtins_test.exe.embed.manifest /OUT:debug\libtins_test.exe @C:\Users\burny1\AppData\Local\Temp\libtins_test.exe.3536.47.jom
main.obj : error LNK2019: unresolved external symbol "public: __cdecl Tins::IPv4Address::IPv4Address(unsigned int)" (??0IPv4Address@Tins@@QEAA@I@Z) referenced in function "public: class Tins::IPv4Address __cdecl Tins::ARP::sender_ip_addr(void)const " (? sender_ip_addr@ARP@Tins@@QEBA?AVIPv4Address@2@XZ)
main.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl Tins::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Tins::IPv4Address const &)" (??6Tins@@YAAEAV?$basic_ostream@DU? $char_traits@D@std@@@std@@AEAV12@AEBVIPv4Address@0@@Z) referenced in function "private: bool __cdecl arp_monitor::callback(class Tins::PDU const &)" (?callback@arp_monitor@@AEAA_NAEBVPDU@Tins@@@Z)
main.obj : error LNK2019: unresolved external symbol "public: virtual __cdecl Tins::BaseSniffer::~BaseSniffer(void)" (??1BaseSniffer@Tins@@UEAA@XZ) referenced in function "public: virtual __cdecl Tins::Sniffer::~Sniffer(void)" (??1Sniffer@Tins@@UEAA@XZ)
main.obj : error LNK2019: unresolved external symbol "public: class Tins::PacketWrapper<class Tins::PDU *,class Tins::Timestamp> __cdecl Tins::BaseSniffer::next_packet(void)" (? next_packet@BaseSniffer@Tins@@QEAA?AV?$PacketWrapper@PEAVPDU@Tins@@VTimestamp@2@@2@XZ) referenced in function "private: void __cdecl Tins::SnifferIterator::advance(void)" (? advance@SnifferIterator@Tins@@AEAAXXZ)
main.obj : error LNK2019: unresolved external symbol "public: class Tins::SnifferIterator __cdecl Tins::BaseSniffer::begin(void)" (?begin@BaseSniffer@Tins@@QEAA?AVSnifferIterator@2@XZ) referenced in function "public: void __cdecl Tins::BaseSniffer::sniff_loop<class std::_Bind<1,bool,struct std::_Pmf_wrap<bool (__cdecl arp_monitor::*)(class Tins::PDU const &),bool,class arp_monitor,class Tins::PDU const &>,class arp_monitor * const,class std::_Ph<1> &> >(class std::_Bind<1,bool,struct std::_Pmf_wrap<bool (__cdecl arp_monitor::*)(class Tins::PDU const &),bool,class arp_monitor,class Tins::PDU const &>,class arp_monitor * const,class std::_Ph<1> &>,unsigned int)" (??$sniff_loop@V? $_Bind@$00_NU?$_Pmf_wrap@P8arp_monitor@@EAA_NAEBVPDU@Tins@@@Z_NV1@AEBV23@@std@@QEAVarp_monitor@@AEAV? $_Ph@$00@2@@std@@@BaseSniffer@Tins@@QEAAXV?$_Bind@$00_NU? $_Pmf_wrap@P8arp_monitor@@EAA_NAEBVPDU@Tins@@@Z_NV1@AEBV23@@std@@QEAVarp_monitor@@AEAV? $_Ph@$00@2@@std@@I@Z)
main.obj : error LNK2019: unresolved external symbol "public: class Tins::SnifferIterator __cdecl Tins::BaseSniffer::end(void)" (?end@BaseSniffer@Tins@@QEAA?AVSnifferIterator@2@XZ) referenced in function "public: void __cdecl Tins::BaseSniffer::sniff_loop<class std::_Bind<1,bool,struct std::_Pmf_wrap<bool (__cdecl arp_monitor::*)(class Tins::PDU const &),bool,class arp_monitor,class Tins::PDU const &>,class arp_monitor * const,class std::_Ph<1> &> >(class std::_Bind<1,bool,struct std::_Pmf_wrap<bool (__cdecl arp_monitor::*)(class Tins::PDU const &),bool,class arp_monitor,class Tins::PDU const &>,class arp_monitor * const,class std::_Ph<1> &>,unsigned int)" (??$sniff_loop@V? $_Bind@$00_NU?$_Pmf_wrap@P8arp_monitor@@EAA_NAEBVPDU@Tins@@@Z_NV1@AEBV23@@std@@QEAVarp_monitor@@AEAV? $_Ph@$00@2@@std@@@BaseSniffer@Tins@@QEAAXV?$_Bind@$00_NU? $_Pmf_wrap@P8arp_monitor@@EAA_NAEBVPDU@Tins@@@Z_NV1@AEBV23@@std@@QEAVarp_monitor@@AEAV? $_Ph@$00@2@@std@@I@Z)
main.obj : error LNK2019: unresolved external symbol "public: __cdecl Tins::Sniffer::Sniffer(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class Tins::SnifferConfiguration const &)" (??0Sniffer@Tins@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBVSnifferConfiguration@1@@Z) referenced in function main
main.obj : error LNK2019: unresolved external symbol "public: __cdecl Tins::SnifferConfiguration::SnifferConfiguration(void)" (??0SnifferConfiguration@Tins@@QEAA@XZ) referenced in function main
main.obj : error LNK2019: unresolved external symbol "public: void __cdecl Tins::SnifferConfiguration::set_promisc_mode(bool)" (? set_promisc_mode@SnifferConfiguration@Tins@@QEAAX_N@Z) referenced in function main
main.obj : error LNK2019: unresolved external symbol "public: void __cdecl Tins::SnifferConfiguration::set_filter(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (? set_filter@SnifferConfiguration@Tins@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V? $allocator@D@2@@std@@@Z) referenced in function main
debug\libtins_test.exe : fatal error LNK1120: 10 unresolved externals
jom: C:\Qt\Tools\QtCreator\bin\build-libtins_test-Desktop_Qt_5_3_MSVC2013_64bit-Debug\Makefile.Debug [debug\libtins_test.exe] Error 1120
jom: C:\Qt\Tools\QtCreator\bin\build-libtins_test-Desktop_Qt_5_3_MSVC2013_64bit-Debug\Makefile [debug] Error 2
03:13:12: The process "C:\Qt\Tools\QtCreator\bin\jom.exe" exited with code 2.
Error while building/deploying project libtins_test (kit: Desktop Qt 5.3 MSVC2013 64bit)
When executing step "Make"
03:13:12: Elapsed time: 00:01.

最佳答案

包括使用 -L 和 -l 符号的库对我使用 MSVC 编译器从来没有用过。我不知道为什么。尝试包括具有完整路径的库,包括扩展。例如。

LIBS += C:/WpdPack/Lib/x64/wpcap.lib \
C:/WpdPack/Lib/x64/packet.lib \
C:/libtins/ws2_32.lib \
C:/libtins/iphlpapi.lib \
C:/libtins/tins.lib

对于 MSVC,即使包含这些库的顺序也很重要。如果一个库依赖于另一个库,则顶级库必须在顶部。即,如果 A.lib 依赖于 B.lib,则必须先添加 A,然后再添加 B。

关于c++ - 静态库链接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26435118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com