Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Ошибка компиляции статической библиотеки

Проблема такая, хотел создать статическую библиотеку, но при компиляции вылазят ошибки. Помогите разобраться в чём проблема)
Сама сборка:
  • Компиляция библиотеки:
    g++ -c static.cpp -o static.o
  • Сборка и индексация библиотеки:
    ar rc lib_MYSTATIC.a static.o
    ranlib lib_MYSTATIC.a
  • Компиляция и линковка программы с библиотекой:
    g++ main.cpp -L. lib_MYSTATIC.a -o static.out
При выполнении компиляции такие ошибки:
Код:

main.cpp: In function ‘int main()’:
main.cpp:22:69: error: ‘newPath’ was not declared in this scope
                 reverseFile(ib->path(), newPath(ib->path(), pd1, pd2));
                                                                     ^
main.cpp:22:70: error: ‘reverseFile’ was not declared in this scope
                 reverseFile(ib->path(), newPath(ib->path(), pd1, pd2));
                                                                      ^
main.cpp:26:66: error: ‘newPath’ was not declared in this scope
                 fs::create_directory(newPath(ib->path(), pd1, pd2));
                                                                  ^

Исходный код библиотеки static.c:
Код:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
 
 
extern "C" void reverseFile(fs::path pfile1, fs::path const& pfile2)
{
    std::fstream ifs(pfile1, std::ios::in | std::ios::binary), ofs(pfile2, std::ios::out | std::ios::binary);
    if (ifs.is_open() && ofs.is_open())
    {
        ifs.seekg(0, ifs.end);
        if (ifs.tellg() >= std::streampos(1))
        {
            for (ifs.seekg(-1, ifs.cur); ; ifs.seekg(-2, ifs.cur))
            {
                ofs.put(ifs.get());
                if (ifs.tellg() == std::streampos(1))
                {
                    break;
                }
            }
        }
    }
    else
    {
        std::cerr << "Unable to open file(s): " << pfile1 << "  " << pfile2 << "\n\n";
    }
    ifs.close();
    ofs.close();
}
 
// создаём путь папки в каталоге с инвертированными файлами
extern "C" fs::path newPath(fs::path const& oldPth, fs::path const& pd1, fs::path const& pd2)
{
    fs::path ret = pd2;
    auto pr = std::mismatch(oldPth.begin(), oldPth.end(), pd1.begin(), pd1.end());
 
    for (auto ib(pr.first), ie(oldPth.end()); ib != ie; ++ib)
    {
        ret /= *ib;
    }
 
    return ret;
}

Исходный код программы (main.cpp):
Код:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;

int main()
{
    try
    {
        fs::path pd1("/home/student/dir1"); // каталог с исходными файлами
        fs::path pd2("/home/student/dir2"); // каталог с инвертированными файлами
        if (!fs::exists(pd2))
        {
            fs::create_directories(pd2); // может кинуть исключение
        }
        for (fs::recursive_directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
        {
            if (fs::is_regular_file(ib->path())) // инвертируем каждый файл 
            {
                reverseFile(ib->path(), newPath(ib->path(), pd1, pd2));
            }
            else if (fs::is_directory(ib->path())) // создаём папку в каталоге с инвертированными файлами
            {
                fs::create_directory(newPath(ib->path(), pd1, pd2));
            }
        }
 
    }
    catch (std::exception const& exc)
    {
        std::cerr << "Exception: " << exc.what() << std::endl;
    }
}

Cобирал по гайду
Ответ:
Цитата:
Сообщение от alexzk
Кстати, вы же понимаете, что параметры ф. у вас классы? Т.е. нельзя использовать extern "C", т.к. там классов нет...собссно потому вы и делаете статик, что его можно пользовать с С++ без доп. проблем.
Смог собрать с прототипами)) Не сразу заметил что в С++ их нужно в программу добавлять. Это по заданию нужно вынести всю функциональную часть в статическую библиотеку. Это совсем неправильно или так можно? Вот только я пока не понял является ли то что я в main оставил, а именно сам цикл функциональной частью или нет.
Вопрос: Ошибка компиляции как положительный результат

Товарищи, подскажите, пожалуйста, есть ли возможность средствами плюсов следить за ошибками компиляции?

Необходимо в процессе компиляции встретить некоторое выражение, удостовериться, что на нём произошла ошибка компиляции, и продолжить компиляцию дальше. При этом в итоге компиляция должна пройти успешно, то есть эта ожидаемая ошибка должна быть подавлена. Получается нечто вроде исключений, но для компиляции.

Если средствами плюсов такое сделать не получится (что вероятнее всего), то как можно попроще это реализовать внешними инструментами?
Ответ: Если это во время компиляции, я представлял бы такое как условную компиляцию. Если один блок кода вызывает ошибку, то вместо него подставляется другой блок кода. Компиляция успешна, если хотя бы один из блоков не вызвал ошибку компиляции. Ну и во втором блоке можно сделать какую-то дополнительную работу, связанную с успешным выполнением негативного теста.
Вопрос: Какие варианты кода не вызовут ошибку компиляции?

Какие варианты кода не вызовут ошибку компиляции?

Вариант 1
class Parent {}
interface FirstChild {}
interface SecondChild extends FirstChild {}

Вариант 2
class Parent {}
interface FirstChild {}
interface SecondChild implements FirstChild {}

Вариант 3
class Parent {}
interface FirstChild {}
class SecondChild implements FirstChild {}

Вариант 4
class Parent {}
interface FirstChild extends Parent {}
class SecondChild implements FirstChild {}

Вариант 5
class Parent {}
class FirstChild extends Parent {}
class SecondChild implements FirstChild {}
что такое interface и implements. новичек ничего не смыслю
Ответ:
Сообщение от amd11
Какие варианты кода не вызовут ошибку компиляции?
Так попробуйте скомпилировать, и узнаете!
Вопрос: Qt добавить статическую библиотеку

Доброй ночи.
Суть проблемы: собрал на днях статическую версию qt 5.2 и в ней же собрал приложение. Оно работает без нареканий.
Решил собрать программу с qtmultimedia - c ним как раз и приключилась беда. В обычной версии qt (НЕ СТАТИК) приложение запускается нормально и работает, а вот в статической компилятор не может найти в папке статическую библиотеку. Добавляю библиотеку через контекстное меню. В .pro файле появляются такие строчки:

Code
1
2
3
4
5
6
win32: LIBS += -L$$PWD/../../Qt/Qt5.2.0/5.2.0/Src/qtmultimedia/lib/ -lQt5Multimedia
 
INCLUDEPATH += $$PWD/../../Qt/Qt5.2.0/5.2.0/Src/qtmultimedia/include
DEPENDPATH += $$PWD/../../Qt/Qt5.2.0/5.2.0/Src/qtmultimedia/include
 
win32-g++: PRE_TARGETDEPS += $$PWD/../../Qt/Qt5.2.0/5.2.0/Src/qtmultimedia/lib/libQt5Multimedia.a
ошибка вываливается следующая:
Code
1
2
:-1: ошибка: cannot find -lQt5Multimedia520
collect2.exe:-1: ошибка: error: ld returned 1 exit status
эту папку (Qt/Qt5.2.0/5.2.0/Src/qtmultimedia) я тоже статически собирал (если верно выражаюсь), все файлы в ней лежат и библиотеки тоже, но компилятор их в упор не видит. Подскажите, пожалуйста, что я делаю не так?!

Заранее спасибо.
Ответ: Вот полное наименование библиотеки libQt5Multimedia.a
Когда собирал папку (Qt/Qt5.2.0/5.2.0/Src/qtmultimedia, то писал команду
mingw32-make -o Makefile.
Больше ничего не делал.

Я так понимаю шаг с командой make install обязателен, верно?!

Добавлено через 14 минут
qt собирал так:
Code
1
2
3
configure -confirm-license -release -opensource -c++11 -static -opengl desktop -nomake examples -nomake tests -no-angle -no-vcproj -audio-backend -qt-sql-mysql -I C:\mysql\include -L C:\mysql\lib -openssl-linked -openssl -I C:\openssl\include -L C:\openssl
 
mingw32-make.exe sub-src
после этого приложение без multimedia статически собирается и работает. Но это, как понимаю, только папка qtbase собиралась.
Вопрос: Ошибка компиляции с Makefile

Хотел бы объяснить нормально, но сам мало чего понимаю. В общем, я хочу получить статическую библиотеку ПО для захвата видеоизображения (). Там уже есть библиотека для VS, но так как их нельзя использовать для MinGW-проектов... Также там уже есть готовый Makefile:
Код
all: ../../compiledLib/msys2/libvideoinput.a         # Есть разница между двумя ../ и одним?

../libs/videoInput/videoInput.o: ../libs/videoInput/videoInput.cpp Makefile
	@g++ -c $< -o "$@" -O3 -I../libs/videoInput/   # Что за %< и "$@"? 

../../compiledLib/msys2/libvideoinput.a: ../libs/videoInput/videoInput.o
	@mkdir -p ../../compiledLib/msys2
	@ar -cr "$@" $<             # Что делает эта команда?
	
.PHONY: clean

clean:
	@rm -f ../../compiledLib/msys2/libvideoinput.a
	@rm -f ../libs/videoInput/videoInput.o
(Вопросы в коде)
И ещё: как это правильно компилировать? Переходить в директорию и тупо make вбивать?
Ответ:
Сообщение от tnk500
all: ../../compiledLib/msys2/libvideoinput.a # Есть разница между двумя ../ и одним?
Есть. Две точки - родительский каталог. Два раза - "дедовский" и т.д.
Сообщение от tnk500
@g++ -c $< -o "$@" -O3 -I../libs/videoInput/ # Что за %< и "$@"?
%< - здесь нету, вам померещилось
$< - первое из условий цели (того, что после знака : , в данном случае ../libs/videoInput/videoInput.cpp)
$@ - цель (то, что слева от : , в данном случае ../libs/videoInput/videoInput.o)
Сообщение от tnk500
@ar -cr "$@" $< # Что делает эта команда?
вызывает утилиту "ar" для создания библиотеки ../../compiledLib/msys2/libvideoinput.a: из файла ../libs/videoInput/videoInput.o
Сообщение от tnk500
И ещё: как это правильно компилировать? Переходить в директорию и тупо make вбивать?
Ага, и не забыть после вбития "Enter" нажать.
Вопрос: Ошибка компиляции: error LNK2019 OpenCV VS2010

Система Windows 7 x64
VS 2010 Ultimate
OpenCV 2.4.9

Я только пробую свои силы в VS С++.... Установку OpenCV делал по инструкции, библиотеки подключил. Проинкладил всё, что знал
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <stdarg.h>
#include <iostream>
#include <fstream>
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    IplImage* frame=cvLoadImage("C:\\Users\\Василий\\Desktop\\2.jpg",1);
 
    cvSmooth(frame,frame,CV_BLUR,3,0,2.0,2.0); // Немножко размоем изображение. Просто так,
                                                   //чтобы потрогать функции OpenCV
 
    if(frame==NULL){ /* Если вдруг такой картинки нет */
        printf("Кажется этот файл не существует");
        exit(0);
    }
 
    cvNamedWindow("Hi", CV_WINDOW_AUTOSIZE );
    cvShowImage("My Window",frame);
    cvSaveImage("image.jpg",frame);
     
    cvWaitKey();/* Ждем, пока вы что-нибудь не нажмете, 
                       иначе окошко просто "мелькнет" и вы
                       можете даже ничего не заметить */
    cvDestroyWindow( "Hi" );
 
return 0;
}
Ошибка компиляции:
Код XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1>------ Построение начато: проект: OpenCV Project1, Конфигурация: Debug Win32 ------
1>Построение начато 20.09.2014 18:42:26.
1>InitializeBuildStatus:
1>  Обращение к "Debug\OpenCV Project1.unsuccessfulbuild".
1>ClCompile:
1>  Для всех выходных данных обновления не требуется.
1>  OpenCV Project1.cpp
1>c:\ocv\opencv\build\include\opencv2\flann\logger.h(67): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\stdio.h(234): см. объявление "fopen"
1>ManifestResourceCompile:
1>  Для всех выходных данных обновления не требуется.
1>OpenCV Project1.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvDestroyWindow в функции _wmain
1>OpenCV Project1.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvWaitKey в функции _wmain
1>OpenCV Project1.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvSaveImage в функции _wmain
1>OpenCV Project1.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvShowImage в функции _wmain
1>OpenCV Project1.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvNamedWindow в функции _wmain
1>OpenCV Project1.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvSmooth в функции _wmain
1>OpenCV Project1.obj : error LNK2019: ссылка на неразрешенный внешний символ _cvLoadImage в функции _wmain
1>c:\users\семья\documents\visual studio 2010\Projects\OpenCV Project1\Debug\OpenCV Project1.exe : fatal error LNK1120: 7 неразрешенных внешних элементов
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:01.31
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
Знаю что компоновщик чего-то не видит, но не понимаю чего и где это взять? Прошу помощи специалистов. Спасибо.
Ответ:
Сообщение от alsav22
Похоже, вы как-то испортили файлы библиотеки. Удалите библиотеку и по новой установите.
Снёс все установки OpenCV их было несколько, может с этим связано. Заново скачал с офсайта версию 2.4.9, затем заново установил. Создал новый пустой проект, скопировал код, подключил библиотеки, скомпилировал.... и... о чудо, появилось консольное окно... а через доли секунды это:



Ошибку пишет эту:



Что за файл PDB нужен компилятору?
Вопрос: Автоматическое подключение к проекту статической библиотеки - зависимости от основной

Есть основное консольное приложение.
Есть моя статическая библиотека, которую я подключаю к основному проекту. Есть ещё одна моя статическая библиотека, которая подключена к первой.
Так вот, я пытаюсь собрать свой консольный проектик, а он требует вторую библиотеку, хотя ясно я её не использую, её использует только подключаемая первая библиотека.
Как сделать так, чтоб при подключение к проекту своей статической внутренней библиотеки автоматический подключились бы все её зависимости?
Ответ: Кстати стоит обратить внимание на циклические зависимости между библиотеками: lib1 зависит от lib2, в то время как lib2 зависит от lib1.
gcc автоматически не разруливает такие ситуации, поэтому либы надо заключить в такую конструкцию:
Код Bash
1
2
3
gcc -( -l1 -l2 )- 
# или 
gcc --start-group -l1 -l2 --end-group
Вопрос: Ошибки при использовании статических библиотек

Мой проект поделен на модули - статические библиотеки, и одно приложение.  При сборке билиотек все проходит на ура. А вот при сборке исполняемого файла валит ошибки:

Код

/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libSourceDatad.a(SerialConfigurator.o): In function `SourceData::SerialConfigurator::SerialConfigurator(Util::ParamStorage&)':
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:9: undefined reference to `Util::ConfiguratorBase::ConfiguratorBase(Util::ParamStorage&)'
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:9: undefined reference to `Util::ConfiguratorBase::~ConfiguratorBase()'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libSourceDatad.a(SerialConfigurator.o): In function `SourceData::SerialConfigurator::SerialConfigurator(Util::ParamStorage&, std::string const&, unsigned int)':
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:18: undefined reference to `Util::ConfiguratorBase::ConfiguratorBase(Util::ParamStorage&)'
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:18: undefined reference to `Util::ConfiguratorBase::~ConfiguratorBase()'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libSourceDatad.a(SerialConfigurator.o): In function `SourceData::SerialConfigurator::~SerialConfigurator()':
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:23: undefined reference to `Util::ConfiguratorBase::~ConfiguratorBase()'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libSourceDatad.a(SerialConfigurator.o): In function `SourceData::SerialConfigurator::GetBaudrate() const':
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:26: undefined reference to `Util::ConfiguratorBase::GetStorage() const'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libSourceDatad.a(SerialConfigurator.o): In function `SourceData::SerialConfigurator::GetDeviceName() const':
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:30: undefined reference to `Util::ConfiguratorBase::GetStorage() const'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libSourceDatad.a(SerialConfigurator.o): In function `SourceData::SerialConfigurator::MakeParam()':
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:34: undefined reference to `Util::ConfiguratorBase::GetStorage() const'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libSourceDatad.a(SerialConfigurator.o): In function `SourceData::SerialConfigurator::InitKey()':
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:46: undefined reference to `Util::ConfiguratorBase::AddKey(std::string)'
/home/kopysov/projects/OrionWebModules/SourceData/Serial/SerialConfigurator.cpp:47: undefined reference to `Util::ConfiguratorBase::AddKey(std::string)'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libSourceDatad.a(SerialConfigurator.o):(.data.rel.ro._ZTIN10SourceData18SerialConfiguratorE[_ZTIN10SourceData18SerialConfiguratorE]+0x8): undefined reference to `typeinfo for Util::ConfiguratorBase'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libSourceDatad.a(Serial.o): In function `SourceData::Serial::DoOpen(Util::ParamStorage const&)':
/home/kopysov/projects/OrionWebModules/SourceData/Serial/Serial.cpp:25: undefined reference to `Util::ConfiguratorBase::IsValid() const'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libTaskLeveld.a(Bus.o): In function `TaskLevel::Bus::Start()':
/home/kopysov/projects/OrionWebModules/TaskLevel/Bus.cpp:72: undefined reference to `Protocol::DeviceListBase::begin()'
/home/kopysov/projects/OrionWebModules/TaskLevel/Bus.cpp:74: undefined reference to `Protocol::DeviceBase::IsPolling() const'
/home/kopysov/projects/OrionWebModules/TaskLevel/Bus.cpp:75: undefined reference to `Protocol::DeviceBase::GetAddres() const'
/home/kopysov/projects/OrionWebModules/TaskLevel/Bus.cpp:72: undefined reference to `Protocol::DeviceListBase::end()'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libTaskLeveld.a(SessionQueue.o): In function `TaskLevel::SessionQueue::SetPriority(std::vector<unsigned char, std::allocator<unsigned char> > const&)':
/home/kopysov/projects/OrionWebModules/TaskLevel/SessionQueue.cpp:109: undefined reference to `Util::QueueGlassCash::QueueGlassCash(std::vector<unsigned char, std::allocator<unsigned char> > const&)'
/home/kopysov/projects/OrionWebModules/TaskLevel/SessionQueue.cpp:111: undefined reference to `Util::QueueGlassCash::IsValid()'
/home/kopysov/projects/OrionWebModules/TaskLevel/SessionQueue.cpp:114: undefined reference to `Util::QueueGlassCash::Make(std::vector<unsigned char, std::allocator<unsigned char> >&)'
/home/kopysov/projects/OrionWebModules/TaskLevel/SessionQueue.cpp:116: undefined reference to `Util::QueueGlassCash::~QueueGlassCash()'
/home/kopysov/projects/OrionWebModules/TaskLevel/SessionQueue.cpp:116: undefined reference to `Util::QueueGlassCash::~QueueGlassCash()'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libTaskLeveld.a(BusConfigurator.o): In function `TaskLevel::BusConfigurator::GetTransportOption() const':
/home/kopysov/projects/OrionWebModules/TaskLevel/BusConfigurator.cpp:94: undefined reference to `SourceData::ParamConverterFactory::ParamConverterFactory()'
/home/kopysov/projects/OrionWebModules/TaskLevel/BusConfigurator.cpp:95: undefined reference to `SourceData::ParamConverterFactory::Create(unsigned int)'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libTaskLeveld.a(BusConfigurator.o): In function `TaskLevel::BusConfigurator::GetDeviceList() const':
/home/kopysov/projects/OrionWebModules/TaskLevel/BusConfigurator.cpp:149: undefined reference to `Protocol::Factory::Factory(unsigned short)'
/home/kopysov/projects/OrionWebModules/TaskLevel/BusConfigurator.cpp:153: undefined reference to `Protocol::Factory::CreateDeviceList() const'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libTaskLeveld.a(BusConfigurator.o): In function `TaskLevel::BusConfigurator::GetProtocol() const':
/home/kopysov/projects/OrionWebModules/TaskLevel/BusConfigurator.cpp:224: undefined reference to `Protocol::Factory::Factory(unsigned short)'
/home/kopysov/projects/OrionWebModules/TaskLevel/BusConfigurator.cpp:225: undefined reference to `Protocol::Factory::CreateProtocol(std::shared_ptr<SourceData::SourceDataBase>&) const'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libTaskLeveld.a(DeviceListDispatcher.o): In function `TaskLevel::DeviceListDispatcher::OnNoAnswer(Util::EmptyNotify<Protocol::SessionNotify, 4u, unsigned int, Util::empty_t2, Util::empty_t2, Util::empty_t2>*)':
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:44: undefined reference to `Protocol::DeviceListBase::operator[](unsigned int)'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:45: undefined reference to `Protocol::DeviceListBase::TestNoAnswer(unsigned char) const'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:46: undefined reference to `Protocol::DeviceBase::IsOnline() const'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:47: undefined reference to `Protocol::DeviceBase::SetOnline(bool)'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:49: undefined reference to `Protocol::DeviceBase::GetNoAnswer() const'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:56: undefined reference to `Protocol::DeviceBase::NoAnswerUp()'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libTaskLeveld.a(DeviceListDispatcher.o): In function `TaskLevel::DeviceListDispatcher::SessionSuccess(unsigned int)':
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:118: undefined reference to `Protocol::DeviceListBase::operator[](unsigned int)'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:120: undefined reference to `Protocol::DeviceBase::NoAnswerClear()'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:122: undefined reference to `Protocol::DeviceBase::SetLastTime()'
make[1]: Leaving directory `/home/kopysov/projects/OrionWebModules/PowerTestDataSession'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:124: undefined reference to `Protocol::DeviceBase::IsOnline() const'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:125: undefined reference to `Protocol::DeviceBase::SetOnline(bool)'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListDispatcher.cpp:132: undefined reference to `Protocol::DeviceListBase::TestSessionPause(unsigned char) const'
/home/kopysov/projects/OrionWebModules/OrionWebModules/../lib/libTaskLeveld.a(DeviceListConfigurator.o): In function `TaskLevel::DeviceListConfigurator::Configure(std::shared_ptr<Protocol::DeviceListBase>&)':
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListConfigurator.cpp:58: undefined reference to `Protocol::DeviceListBase::SetMaxAddress(unsigned int)'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListConfigurator.cpp:59: undefined reference to `Protocol::DeviceListBase::SetMaxNoAnswer(unsigned int)'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListConfigurator.cpp:60: undefined reference to `Protocol::DeviceListBase::SetMaxSessionPause(unsigned int)'
/home/kopysov/projects/OrionWebModules/TaskLevel/DeviceListConfigurator.cpp:61: undefined reference to `Protocol::DeviceListBase::SetPolling(std::list<unsigned char, std::allocator<unsigned char> > const&)'
collect2: error: ld returned 1 exit status
make[1]: *** [../bin/PowerTest] Error 1
make: *** [sub----PowerTestDataSession-make_default-ordered] Error 2
13:57:13: Процесс «/usr/bin/make» завершился с кодом 2.


Причем этот проект под WIN MSVC2010 все отлично собирается, не понимаю что за особенность GCC такая лазить за либами в исходники дважды.
Ответ:
В моем случае помогло добавить ключи -Wl,--start-group [список библиотек] -Wl,--end-group, для qmake выглядит так:
Код

LIBS += -L$${LIB_PATH}
unix{
    LIBS+=-Wl,--start-group \
}
LIBS+=  -lOrionPro$${DBG_SUF} \
        -lTaskLevel$${DBG_SUF} \
        -lSourceData$${DBG_SUF} \
        -lTest$${DBG_SUF} \
        -lProtocol$${DBG_SUF} \
        -lUtil$${DBG_SUF} \
        -lSerial$${DBG_SUF} \
unix{
        LIBS+=-Wl,--end-group
}

Вопрос: Подключить собственную статическую библиотеку через переменную CONFIG

Всем доброго времени суток, подскажите пожалуйста как подключить свою статическую библиотеку через переменную CONFIG. Желательно пошагово. Перед тем как написать сюда, я прочитал и оф документацию и просто погулял по просторам. Чего я добился уже:

1. В .pro файле написал так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
LIB = loading_bar
 
CONFIG += $${LIB}
 
CONFIG(loading_bar){
    message($$LIB Successfully plugged)
} else {
    message($$LIB Is not available)
}
 
SOURCES += main.cpp
где loading_bar - название для моей библиотеки.

2. Выполнил команду qmake -set QMAKEFEATURES и передал путь до папки в которой располагается .prf файл
3. Проверил корректное выполнение п.2 командой qmake -query QMAKEFEATURES
4. Осталось только правильно указать в .prf файле где подцепить хедер и библиотеку, я правильно понимаю?
Если да, то что там надо прописать?

Я сначала там просто расположил такой код (либа и хедеры в одной папке):
C++ (Qt)
1
2
3
INCLUDEPATH += $$/home/slevin/my_libs/loading_bar
 
LIBS += -L$$/home/slevin/my_libs/loading_bar -lloading_bar


Но увы, слишком наивно было расчитывать на это.
Подскажите варианты решения моей проблемы, может я вообще некорректно что-то делаю.
Спасибо за внимание.
Ответ: Мне необходимо подцеплять свои библиотеки таким же образом как подцепляются библиотеки Qt - с помощью одной записи в .pro файле:
C++ (Qt)
1
CONFIG += qt
Так же и свои библиотеки хочу подключать. Без использования таких переменных как:
C++ (Qt)
1
2
INCLUDEPATH += \
LIBS += \
Считаю это более профессиональным подходом.
Вопрос: Ошибки компиляции с библиотекой Curl

Добрый день, добавил либу curl, всё по инструкции, но при компиляции:

C++
1
2
3
4
5
6
7
8
9
10
1>1>MyForm.obj : error LNK2020: эхЁрчЁх°хээр* ыхъёхьр (0A00003E) "extern "C" enum CURLcode __cdecl curl_easy_setopt(void *,enum CURLoption,...)" (?curl_easy_setopt@@$$J0YA?AW4CURLcode@@PAXW4CURLoption@@ZZ)
1>MyForm.obj : error LNK2028: ёёв€љыър эр эхЁрчЁх°хээєв–* ыхъёхьє (0A00004D) "extern "C" void * __cdecl curl_easy_init(void)" (?curl_easy_init@@$$J0YAPAXXZ) т ЇєэъЎшш "void __cdecl Main(void)" (?Main@@$$FYAXXZ)
1>MyForm.obj : error LNK2020: эхЁрчЁх°хээр* ыхъёхьр (0A000055) "extern "C" enum CURLcode __cdecl curl_easy_setopt(void *,enum CURLoption,...)" (?curl_easy_setopt@@$$J0YA?AW4CURLcode@@PAXW4CURLoption@@ZZ)
1>MyForm.obj : error LNK2028: ёёв€љыър эр эхЁрчЁх°хээєв–* ыхъёхьє (0A000071) "extern "C" void __cdecl curl_easy_cleanup(void *)" (?curl_easy_cleanup@@$$J0YAXPAX@Z) т ЇєэъЎшш "void __cdecl Main(void)" (?Main@@$$FYAXXZ)
1>MyForm.obj : error LNK2028: ёёв€љыър эр эхЁрчЁх°хээєв–* ыхъёхьє (0A00007B) "extern "C" enum CURLcode __cdecl curl_easy_perform(void *)" (?curl_easy_perform@@$$J0YA?AW4CURLcode@@PAX@Z) т ЇєэъЎшш "void __cdecl Main(void)" (?Main@@$$FYAXXZ)
1>MyForm.obj : error LNK2020: эхЁрчЁх°хээр* ыхъёхьр (0A000081) "extern "C" enum CURLcode __cdecl curl_easy_setopt(void *,enum CURLoption,...)" (?curl_easy_setopt@@$$J0YA?AW4CURLcode@@PAXW4CURLoption@@ZZ)
1>MyForm.obj : error LNK2019: ёёв€љыър эр эхЁрчЁх°хээв€љщ тэх°эшщ ёшьтюы "extern "C" void * __cdecl curl_easy_init(void)" (?curl_easy_init@@$$J0YAPAXXZ) т ЇєэъЎшш "void __cdecl Main(void)" (?Main@@$$FYAXXZ)
1>MyForm.obj : error LNK2001: эхЁрчЁх°хээв€љщ тэх°эшщ ёшьтюы ""extern "C" enum CURLcode __cdecl curl_easy_setopt(void *,enum CURLoption,...)" (?curl_easy_setopt@@$$J0YA?AW4CURLcode@@PAXW4CURLoption@@ZZ)"
1>MyForm.obj : error LNK2019: ёёв€љыър эр эхЁрчЁх°хээв€љщ тэх°эшщ ёшьтюы "extern "C" enum CURLcode __cdecl curl_easy_perform(void *)" (?curl_easy_perform@@$$J0YA?AW4CURLcode@@PAX@Z) т ЇєэъЎшш "void __cdecl Main(void)" (?Main@@$$FYAXXZ)
1>MyForm.obj : error LNK2019: ёёв€љыър эр эхЁрчЁх°хээв€љщ тэх°эшщ ёшьтюы "extern "C" void __cdecl curl_easy_cleanup(void *)" (?curl_easy_cleanup@@$$J0YAXPAX@Z) т ЇєэъЎшш "void __cdecl Main(void)" (?Main@@$$FYAXXZ)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "MyForm.h"
#include <curl/curl.h>
 
using namespace System;
using namespace System::Windows::Forms;
 
[STAThread]
void Main(void)
{
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false);
 
    Проект2::MyForm form;
    Application::Run(%form);
    CURL *curl;
    CURLcode res;
    curl = curl_easy_init();
    if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
    /* example.com is redirected, so we tell libcurl to follow redirection */ 
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
 
    /* Perform the request, res will get the return code */ 
    res = curl_easy_perform(curl);
    /* Check for errors */ 
    //if(res != CURLE_OK)
     /*fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));
*/ 
    /* always cleanup */ 
    curl_easy_cleanup(curl);
  //}
}
Что-то с extern, но как ни пробовал, ничего не изменилось.
Ответ:

Не по теме:

Ну та не фиг работать с выключенным мозгом...