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

Проблема такая, хотел создать статическую библиотеку, но при компиляции вылазят ошибки. Помогите разобраться в чём проблема)
Сама сборка:
  • Компиляция библиотеки:
    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 оставил, а именно сам цикл функциональной частью или нет.
Вопрос: Автоматическое подключение к проекту статической библиотеки - зависимости от основной

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

Создаю в Qt Creator, но думаю, что проблема не в нём...

Создаю статическую библиотеку lib1 в Qt без использования QtCore. Проект получается, по-умолчанию, содержащий файлы lib1.cpp и lib1.h,
в которых описан пустой класс Lib1 (только пустой конструктор).

Создаю тестовое приложение "Проект без Qt", которое так и называется test, подключаю к нему эту либу - всё работает.

Теперь создаю также как и lib1 статическую библиотеку lib2.

lib2.cpp:

C++
1
2
3
4
5
6
#include "lib1.h"
#include "lib2.h"
 
Lib2::Lib2() {
    Lib1 *lib1 = new Lib1();
}
Компилирую библиотеку Lib2 - пока всё работает как надо.

Вставляю в своё приложение строчку:

C++
1
Lib2 *lib2 = new Lib2();
И тут появляется странная ошибка:

Undefined reference to Lib1::Lib1() в файле lib2.cpp

Что за странная ошибка? Что я делаю не так?
Ответ: В .pro-файле допиши:
C++ (Qt)
1
LIBS += -llib1 -llib2
Это добавит линковку с твоими библиотеками.
Вопрос: 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 собиралась.
Вопрос: Явное подключение dll библиотек

Привет всем. Недавно начал изучать c++ и столкнулся с проблемой подключения длл библиотек (динамически, статически всё получилось).

Код вызова dll

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    HINSTANCE load = LoadLibrary(L"DLLDyn2.dll");
 
typedef int(__stdcall *pfsum)(double, double);
pfsum f1;
f1 = (pfsum)GetProcAddress(load, "f1");
 
int n, m;
std::cin >> n >> m;
    std::cout << f1(n, m);
 
 
    
FreeLibrary(load);
system("pause");
Само длл:
Сорс код
C++
1
2
3
4
5
6
7
#include <windows.h>
 
extern "C" double __declspec(dllexport) __stdcall f1 (double n, double m)
 
{   
    return n*m;
}
Хидер
C++
1
extern "C" double __declspec(dllexport) __stdcall f1(double n, double m)
При написании чисел в командной строке вылетает куча ошибок:
Вызвано исключение по адресу 0x00000000 в proverka.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x00000000. Подобного характера.
Что я делаю не так ? Помогите плз.
Ответ: Сделай проверку ошибок для начала.
Что возвращает LoadLibrary? Что возвращает GetProcAddress?
Если NULL, то что в GetLastError()? И т.д.
Вопрос: Ошибки при использовании статических библиотек

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

Код

/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
}

Вопрос: Подключение статической библиотеки к DLL

Доброе время суток
Мне необходимо использовать библиотеку GLScene в DLL. Но после её подключения при компоновке не находятся её OBJ файлы, например:
    [ilink32 Error] Fatal: Unable to open file 'GLFILE3DS.OBJ'

При этом соответствующие *.hpp файлы подключены и ругается в случае указания соответствующего OBJ файла в pragma link:
    #pragma link "GLFile3DS"

Предполагаю, что её файлы нужно прописать в настройках проекта, но не знаю где. Подскажите пожалуйста, как решить данную проблему.
Ответ:
Directories/Conditionals (Project|Options)?
Сообщение отредактировано: Bas -
Вопрос: Подключить собственную статическую библиотеку через переменную 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 += \
Считаю это более профессиональным подходом.
Вопрос: Создать статическую библиотеку

Создать статическую библиотеку и реализовать приложение "банкомат" с ее использованием.
Код банкомата:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include <iostream>//для работы cout, cin и прочего
using namespace std;//используем пространство имен std для cout, cin и прочего
const int nominals[] = {10,50,100,500,1000,5000,10000};//массив с номиналами купюр
#define NOMINAL  7//количество купюр (номиналов)
class Bankomat {//класс бакомат
private://так лучше по стилистике - делать приватными поля
    int ID;//идентификационный номер банкомата
    int minSum, maxSum;//минимальная и максимальная сумма денег для одного клиента в день
    int sum[NOMINAL];//текущая сумма денег в банкомате
public:
    Bankomat() {//конструктор по умолчанию
        ID = 0;//номер равен нулю
        minSum = 10;//минимальная сумма - минимальный номинал
        maxSum = 10000;//максимальна сумма - мксимальный номинал
        for (int i = 0; i < NOMINAL; i++)//заполняем нулями банкомат
        {
            sum[i] = 0;//нет купюр изначально
        }
    
    }
    Bankomat(int Id) {//тоже самое, но передаем идентификационный номер
        ID = Id;//передаем
        minSum = 10;
        maxSum = 10000;
        for (int i = 0; i < NOMINAL; i++)
        {
            sum[i] = 0;//нет купюр изначально
        }
    }
    Bankomat(int Id, int min, int max, int a[NOMINAL]) {//конструктор с параметрами, передаем номер, минимальное и максимальное за день, и набор купюр
        ID = Id;
        minSum = min; maxSum = max;
        for (int i = 0; i < NOMINAL; i++)
        {
            sum[i] = a[i];//купюры из массива
        }
    }
    Bankomat(Bankomat &atm) {//когструктор копирования, все данные присваиваем из аргумента
        ID = atm.ID;
        minSum = atm.minSum;
        maxSum = atm.maxSum;
        for (int i = 0; i < NOMINAL; i++)
            sum[i] = atm.sum[i];
    }
    int countMoney() const {//выдаем сумму денег из банкомата
        int count = 0;//счетчик
        for (int i = 0; i < NOMINAL; i++) {
            count += sum[i] * nominals[i];//прибавляем количество денег (количество данных купюр*номинал этих купюр)
        }
        return count;//возващаем
    }
    void loadMoney(int moneys[NOMINAL]) {//загрузить деньги в банкомат
        for (int i = 0; i < NOMINAL; i++) {
            sum[i] += moneys[i];//прибавляем количество купюр данного номинала
        }
    }
    bool getMoney(int need) {//получаем деньги
        if (need < minSum) {//если меньше минимала
            cout << "Требуемая сумма меньше минимально возможной - " << minSum << endl;
            return false;//возвращаем неправильное завешение работы
        }
        if (need > maxSum) {//или наоборот - если денег больше установленного максимума
            cout << "Требуемая сумма больше максимально возможной - " << maxSum << endl;
            return false;
        }
        if (need > countMoney()) {//если денег в банкомате недостаточно, но требуемое - меньше максимума
            cout << "Извините, банкомат не обладает данной суммой в данный момент!" << endl;
            return false;
        }
        if (need%nominals[0] != 0) {//если число не круглое (например 1589 - мы не сможем выдать 9 рублей, так как наименьший номинал - 10)
            cout << "Сумма некорректна! " << endl;
            return false;
        }
        int temp = need;//переменная для хранения остатка, которого надо выдать, когда станет равным нулю - деньги выданы
        for (int i = NOMINAL - 1; i >= 0; i--) {//начинаем выавать с крупных купюр
            int tmpsum = temp /  nominals[i];//считаем количество нужных данных купюр
            if (tmpsum > sum[i]) {//если надо больше таких купюр, чем есть, то выдадим сколько есть
                tmpsum = sum[i];
            }
            sum[i] -= tmpsum;//вычитаем выданные купюры из банкомата
            temp -= tmpsum*nominals[i];//вычитаем из остатка выданное
            if (temp <= 0) {//если выдали нужную сумму - уже нет смысла продолжать
                break;
            }
        }
        if (temp > 0) {
            cout << "Недостаточно денег в банкомате(" << endl;//если не удалось выдать нужное количество денег (купюрами такая сумма не  нашлась, допустим в банкомате есть 5к, а нам надо 250, но 50 нет)
            return false;
        }
        cout << "Успешно!" << endl;
        return true;
    }
    char*toString() const{
        char *a = new char[256];
        int money = countMoney();
        _itoa_s(money,a,256,10);//переводим число денег в строку 
        return a;//сумма денег в строке
    }
    void getInfo() {//информация про банкомат
        cout << "Банкомат: " << ID << endl;
        cout << "Минимальная сумма за день: " << minSum << endl;
        cout << "Максимальная сумма за день: " << maxSum << endl;
        cout << "Денег в банкомате: " << countMoney() << endl;
    }
    void operator +(int money[NOMINAL]) {
        loadMoney(money);//загружаем деньги
    }
    bool operator - (int need) {
        return getMoney(need);//снимаем
    }
    void setId(int id) {
        ID = id;
    }
    void setMaxSum(int max) {
        maxSum = max;
    }
    void setMinSum(int min) {
        minSum = min;
    }
    void setSum(int a[NOMINAL]) {
        for (int i = 0; i < NOMINAL; i++)
            sum[i] = a[i];
    }
    int getId() {
        return ID;
    }
    int getMax() {
        return maxSum;
    }
    int getMin() {
        return minSum;
    }
    int* getSum() {
        return sum;
    }
};
 
int main() {//главная функция программы
    setlocale(LC_ALL, "Russian");//включаем русский язык в консоли
    cout << "Введите номер банка" << endl;
    Bankomat atm;
    int n; cin >> n; atm.setId(n);
    cout << "Введите минимальную и максимальную сумму" << endl;
    int min, max; cin >> min >> max; atm.setMinSum(min); atm.setMaxSum(max);
    cout << "вводите количество купюр:" << endl;
    int arr[NOMINAL];
    for (int i = 0; i < NOMINAL; i++) {
        cout << nominals[i] << ": - ";
        int tmp;
        cin >> tmp;
        arr[i] = tmp;
    }
    atm.setSum(arr);
    atm.getInfo();
    cout << "Введите нужную сумму для снятия" << endl;
    int sum; cin >> sum;
    while (!(atm - sum)) {
        cout << "вводите количество купюр для загрузки:" << endl;
        int arr[NOMINAL];
        for (int i = 0; i < NOMINAL; i++) {
            cout << nominals[i] << ": - ";
            int tmp;
            cin >> tmp;
            arr[i] = tmp;
        }
        atm+(arr);
        cout<<"денег - "<<atm.toString()<<endl;
        cout << "Снимайте деньги" << endl;
        cin >> sum;
    }
    system("pause");//пауза (ждем клавишу), чтобы программа не закрылась сразу же
    return 0;//выход из главной функции (программы)
}
Ответ: не подключается библиотека
Вопрос: Ошибка подключения к базе данных: A database with the same name exists

Добрый день всем Userам.

Подскажите пожалуйста как исправить ошибку подключение к Локальной базе данных SQL Server Compact 4.0
Заранее спасибо
вот ошибка

An attempt to attach an auto-named database for file C:\Users\student\Desktop\Новая папка\SeredaApcationASP\SeredaApcationASP\App_Data\Database1.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.


Добавлено через 2 минуты
Web.config
Код HTML5
1
2
3
4
5
6
7
8
9
<configuration>
    <system.web>
      <compilation debug="true" targetFramework="4.5.1" />
      <httpRuntime targetFramework="4.5.1" />
    </system.web>
  <connectionStrings>
    <add name="db1" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename='E:\C#\ASP.NET\MySiteUkraine\MySiteUkraine\App_Data\UsersDB.sdf';Integrated Security=True;"/>
  </connectionStrings>
</configuration>
Код C#
1
2
3
4
5
6
7
8
9
10
11
12
13
string conn_str = WebConfigurationManager. ConnectionStrings["db1"]. ConnectionString;
                SqlConnection conn = new SqlConnection ( conn_str );
                try
                    {
                    conn. Open ();
                    Response. Write ( "Подключилось" );
                    conn. Close ();
                    }
                catch ( Exception ex )
                    {
                    Response. Write ( ex. Message );
                    }
                }
Ответ: Привет.
Ты подключаешь одну базу, а ошибка выдается-то по другой. Зайди в SQL Management Studio на сервер (localdb)\v11.0 , отруби там эту базу "Database1.mdf".
Также можно попробовать засунуть эту "UserDB.sdf" в папку "App_Data" проекта. Именно проекта, который в студии запущен. Тогда для подключения можно использовать синтаксис "|DataDirectory|":
Код XML
1
AttachDBFilename=|DataDirectory|\UserDB.sdf
Попробуй другие типы строк подключений из этого ответа http://stackoverflow.com/questions/1...se1-mdf-failed