ошибка компоновщика со статической библиотекой c ++, которая ссылается на другую библиотеку - PullRequest
5 голосов
/ 25 ноября 2011

Я довольно новичок в c ++, и у меня возникла проблема с отладкой ошибки компоновщика. Я использую wxDev-c ++ с компилятором g ++. Я создал статическую библиотеку, которую я связываю с базовым проектом. Изначально библиотека не содержала ссылок на внешние заголовочные файлы или библиотеки, это была всего лишь пара простых тестовых функций, складывающих вместе 2 двойника и возвращающих значение. Это работало нормально, когда связано с тестовым проектом. Однако сейчас я пытаюсь включить FTP в эту библиотеку и получаю ошибки компоновщика.

В данный момент тестовая функция просто пытается получить доступ к той же простой функции добавления для тестирования, я даже пока не вызываю функцию 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;
}

Вывод журнала компиляции для библиотеки (нормально компилируется):

Выполнение make ... mingw32-make.exe -f "Makefile.win" все g ++. exe -c DaFTPLib.cpp -o Объекты / MingW / DaFTPLib.o -I "C: / Program Files (x86) /Dev-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 (x86) / Dev-Cpp / include / common / wx / html "-I" C: / Program Files (x86) / Dev-Cpp / include / common / wx / протокол "-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"

ar rcu "Вывод / MingW / libDaFTP.a" "Объекты / MingW / DaFTPLib.o"

Исполнение прекращено Компиляция успешна На компиляцию ушла 1 секунда

Вывод журнала компиляции для тестового проекта (ошибка компиляции)

Выполнение make ... mingw32-make.exe -f "Makefile.win" все g ++. exe -c main.cpp -o Объекты / MingW / main.o -I "C: / Program Files (x86) /Dev-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 (x86) / Dev-Cpp / include / common / wx / html "-I" C: / Program Files (x86) / Dev-Cpp / include / common / wx / протокол "-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 "Объекты / MingW / main.o" -o "Вывод / MingW / LibTest.exe" -L "C: / Программные файлы (x86) / Dev-Cpp / Lib" ../libDaFTP/Output /MingW/libDaFTP.a

Objects / MingW / main.o: main.cpp :(. Rdata $ _ZTV20wxThreadHelperThread [vtable for wxThreadHelperThread] + 0xc): неопределенная ссылка на wxThread::TestDestroy()' Objects/MingW/main.o:main.cpp:(.text$_ZN20wxThreadHelperThreadD1Ev[wxThreadHelperThread::~wxThreadHelperThread()]+0x16): undefined reference to wxThread :: ~ wxThread () ' Objects / MingW / main.o: main.cpp :(. Text $ _ZN20wxThreadHelperThreadD0Ev [wxThreadHelperThread :: ~ wxThreadHelperThread ()] + 0x16): неопределенная ссылка на 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): неопределенная ссылка на 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 :: Connect (wxString const &) ' ../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:(.text+0x45a): неопределенная ссылка на wxFTP::~wxFTP()' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text$_ZN8wxStringaSERKS_[wxString::operator=(wxString const&)]+0x14): undefined reference to wxStringBase :: operator = (wxStringBase const &) '../libDaFTP/Выходные данные / MingW / libDaFTP.a (DaFTPLib.o): DaFTPLib.cpp :(. Text $ _ZN12wxStringBaseC2EPKc [wxStringBase :: wxStringBase (char const *)] + 0x7): неопределенная ссылка на wxStringBase::npos' ../libDaFTP/Output/MingW/libDaFTP.a(DaFTPLib.o):DaFTPLib.cpp:(.text$_ZN12wxStringBaseC2EPKc[wxStringBase::wxStringBase(char const*)]+0x25): undefined reference to wxStringBase :: InitWith :: InitWith*, unsigned int, unsigned int) 'collect2: ld вернул 1 состояние выхода

mingw32-make.exe: * [Output / MingW / LibTest.exe] Ошибка 1

Выполнение прервано. Сбой компиляции.Сделать возвращено 2


Я прошу прощения за длинный пост, но, надеюсь, это достаточно информации для кого-то, чтобы указать мне в правильном направлении.Я предполагаю, что проблема заключается во включении библиотеки wx / protocol / ftp, но я предполагал, что при компиляции моей библиотеки любые поддерживающие библиотеки, такие как ftp, будут скомпилированы с ней.

1 Ответ

6 голосов
/ 26 ноября 2011

но я предполагал, что при компиляции моей библиотеки любые поддерживающие библиотеки, такие как ftp, будут скомпилированы с ней.

То, что вы говорите, верно только для динамическисвязанные библиотеки: если вы создаете статическую библиотеку, которая ссылается на другие библиотеки, приложение или библиотека DLL, которая ссылается на вашу статическую библиотеку, все равно должна ссылаться на другие библиотеки.Статическая библиотека - это не что иное, как коллекция скомпилированного объектного кода.Внешние функции, на которые есть ссылки в коде библиотеки, были связаны , а не .

Либо сделайте свою вспомогательную библиотеку DLL и свяжите ее с библиотекой wx, либо оставьте ее статической и свяжите каждое приложение, которое используетвашу статическую библиотеку в библиотеку wx.

...