与C++静态库链接错误,引用另一个库

问题描述:

我很新的C++,我有调试链接错误的问题。我正在使用g ++编译器使用wxDev-C++。我创建了一个静态库,我将其链接到一个基本项目。该库最初不包含对外部头文件或库的引用,它只是一些简单的测试函数,它们将2个双精度值相加并返回值。链接到测试项目时,此工作正常。不过,我现在正试图将FTP并入该库中,现在我正在收到链接器错误。与C++静态库链接错误,引用另一个库

目前测试功能只是试图访问同一个简单的添加功能进行测试,我还没有调用FTP功能,但因为我只是想测试项目正确编译。

库代码:

DaFTPLib.h:

#ifndef WAVE_H 
#define WAVE_H 
#ifdef __BORLANDC__ 
#pragma hdrstop 
#endif 

#ifndef WX_PRECOMP 
#include <wx/wx.h> 
#else 
#include <wx/wxprec.h> 
#endif 

#include <wx/protocol/ftp.h> 

namespace Wave 
{ 
    class DaFTP 
    { 
     public: 
     DaFTP(char *url, char *login, char *password); 
     ~DaFTP(); 
     const int Download(char* fileName); 
     static const void DownloadNCWD(char *url, char *fileName, char *login, char *password); 
     static const void DownloadLAMP(); 
     static double FuncA(double a, double b); 
     static double FuncB(double a, double b); 

     private: 
     char* url, login, password; 
     wxFTP ftp; 
    }; 
} 

#endif 

DaFTP.cpp:

#include "DaFTPLib.h" 

using namespace std; 
char* _url; 
char* _login; 
char* _password; 
wxFTP ftp; 

namespace Wave 
{ 
    DaFTP::DaFTP(char *url, char *login, char *password) 
    { 
     _url = url; 
     _login = login; 
     _password = password; 
    } 

    DaFTP::~DaFTP(){} 

    const int DaFTP::Download(char *fileName) 
    { 
     int fileSize; 

     ftp.SetPassive(true); 
     ftp.SetUser(_login); 
     ftp.SetPassword(_password); 
     ftp.Connect(_url); 

     fileSize = ftp.GetFileSize(fileName); 
     return fileSize; 
    } 

    const void DaFTP::DownloadNCWD(char *url, char *fileName, char *login, char *password) 
    { 
     DaFTP daftp(url, login, password); 
     daftp.Download(fileName); 
    } 

    const void DaFTP::DownloadLAMP() {} 

    double DaFTP::FuncA(double a, double b) 
    { 
     return a + b; 
    } 
    double DaFTP::FuncB(double a, double b) 
    { 
     return a - b; 
    } 
} 

测试项目代码:

#include <cstdlib> 
#include <iostream> 

#include "../libDaFTP/DaFTPLib.h" 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    double a, b, c; 

    a = 23.32; 
    b = 26.68; 

    c = Wave::DaFTP::FuncA(a, b); 
    cout << "FuncA val: " << c << endl; 

    c = Wave::DaFTP::FuncB(a, b); 
    cout << "FuncB val: " << c << endl; 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

的编译LO克输出的库(编译OK):

执行使... 的mingw32-的make.exe -f “Makefile.win” 所有 克++ EXE -c DaFTPLib.cpp -o对象/ MingW平台/ DaFTPLib。的.o -I “C:/程序文件(x86)/Dev-Cpp/lib/gcc/mingw32/3.4.5/include” -I“C:/程序文件(x86)/开发-CPP /包括/ C++/3.4.5 /向后“-I”C:/ Program Files(x86)/ Dev-Cpp/include/C++/3.4.5/mingw32“-I”C:/ Program Files(x86)/ Dev-Cpp/include/C++/3.4.5“-I”C:/ Program Files(x86)/ Dev-Cpp/include“-I”C:/ Program Files(x86)/ Dev-Cpp /“-I” 86)/开发-CPP /包括/普通/ WX/MSW “-I ”C:/ Program Files文件(86)/开发-CPP /包括/普通/ WX /通用“ -I” C:/ Program Files文件(86)/dev-cpp/include/common/wx/html“-I”C:/ Program Files(x86)/ Dev-Cpp/include/common/wx/protocol“-I”C:/ Program Files(x86)/ Dev -Cpp/include/common/wx/xml“-I”C:/ Program Files(x8 6)/开发-CPP /包括/普通/ WX/XRC “-I ”C:/程序文件(x86)/开发-CPP /包括/普通/ WX“ -I” C:/程序文件(x86)/开发-cpp /包含/共同”

AR RCU “输出/ MingW平台/ libDaFTP.a”, “对象/ MingW平台/ DaFTPLib.o”

执行终止 编译成功 编译耗时1秒钟完成

测试项目的编译日志输出(编译失败)

执行make ... 的mingw32-的make.exe -f “Makefile.win” 所有 克++ EXE -c的main.cpp -o对象/ MingW平台/ main.o -I“C:/程序文件(x86)/开发-CPP/LIB/GCC /mingw32/3.4.5/include“-I”C:/ Program Files(x86)/ Dev-Cpp/include/C++/3.4.5/backward“-I”C:/ Program Files(x86)/ Dev-Cpp /include/c++/3.4.5/mingw32“-I”C:/ Program Files(x86)/ Dev-Cpp/include/C++/3.4。5“-I”C:/ Program Files(x86)/ Dev-Cpp/include“-I”C:/ Program Files(x86)/ Dev-Cpp /“-I”C:/ Program Files(x86)/ Dev -Cpp/include/common/wx/msw“-I”C:/ Program Files(x86)/ Dev-Cpp/include/common/wx/generic“-I”C:/ Program Files/include/common/wx/html“-I”C:/ Program Files(x86)/ Dev-Cpp/include/common/wx/protocol“-I”C:/ Program Files(x86)/ Dev-Cpp/include/common/wx/xml“-I”C:/ Program Files(x86)/ Dev-Cpp/include/common/wx/xrc“-I”C:/ Program Files(x86)/ Dev-Cpp/include/common/wx“-I”C:/ Program Files(x86)/ Dev-Cpp/include/common“

g ++。exe”Objects/MingW/main.o“-o”Output/MingW/LibTest.exe“ -L“C:/ Program Files(x86)/ Dev-Cpp/Lib”../libDaFTP/Output/MingW/libDaFTP.a

Objects/MingW/main.o:main.cpp :(。rdata $ _ZTV20wxThreadHelperThread [vtable for wxThrea wxThread ::〜wxThread()' Objects/MingW/main.o:main.cpp :(。text $ _ZN20wxThreadHelperThreadD0Ev [wxThreadHelperThread ::〜wxThreadHelperThread()] + 0x16):undefined参考wxThread::TestDestroy()' Objects/MingW/main.o:main.cpp:(.text$_ZN20wxThreadHelperThreadD1Ev[wxThreadHelperThread::~wxThreadHelperThread()]+0x16): undefined reference to wxThread ::〜wxThread参考wxThread::~wxThread()' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text+0x10): undefined reference to wxFTP :: wxFTP()' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:((text+0x3e):undefined reference to wxFTP::wxFTP()' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text+0x6c): undefined reference to wxFTP ::〜wxFTP( ) ' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text+0x82):未定义参照wxFTP::~wxFTP()' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text+0x1e3): undefined reference to wxFTP ::连接(wxString常量&)' ../ libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp :(.text + 0x24e):未定义的参考wxFTP::GetFileSize(wxString const&)' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text+0x43f): undefined reference to wxFTP :: wxFTP()' ../libDaFTP/Output/MingW/libDaFTP.a (DaFTPLib.o):DaFTPLib.cpp :(文字+为0x4图5a):未定义参照wxFTP::~wxFTP()' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text$_ZN8wxStringaSERKS_[wxString::operator=(wxString const&)]+0x14): undefined reference to wxStringBase ::运算符=(const的wxStringBase &)” ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text$_ZN12wxStringBaseC2EPKc[wxStringBase :: wxStringBase(字符常量*)] +为0x7):未定义参照wxStringBase::npos' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text$_ZN12wxStringBaseC2EPKc[wxStringBase::wxStringBase(char const*)]+0x25): undefined reference to wxStringBase :: InitWith(字符常量*,无符号整型,无符号整型)” collect2:LD返回1退出状态

的mingw32-的make.exe:* [Output/MingW/LibTest.exe]错误1

执行终止 编译失败。 Make returned 2


对于这篇长文章我很抱歉,但希望这是足够的信息让某人指向正确的方向。我认为问题在于合并了wx/protocol/ftp库,但我的设想是,编译我的库时,任何支持库(如ftp)都将与它一起编译。

但我在这样的假设下编译我的库时,任何支持库,如ftp的东西都会被编译进去。

对于动态链接库,您只能说:如果您构建引用其他库的静态库,则链接到静态库的应用程序或DLL仍需链接到其他库。静态库只不过是编译目标代码的集合。库代码中引用的外部功能已没有一直在联系。

要么让你的助手库DLL,并链接到WX库,或保持静态和链接,使用您的静态库的WX每个应用程序图书馆。

+0

得到它的工作基础 - 我似乎无法找到一种方式来确定哪些文件确实需要链接,但我已经通过链接在似乎涵盖所有基地的大量文件列表中进行编译。 – TheOx