Форум программистов, компьютерный форум CyberForum.ru

Как студию подружить со статической библиотекой скопилированой в MinGW ? - C++

Восстановить пароль Регистрация
 
popelyuk
 Аватар для popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
16.02.2013, 21:26     Как студию подружить со статической библиотекой скопилированой в MinGW ? #1
Со скопилироваными в Visual Studio либами всё вроде норм, а с этим что-то артачится и выдаёт что не может найти определения функций:

Error 2 error LNK2001: unresolved external symbol "public: void __thiscall My_lib::show_me(void)" (?show_me@My_lib@@QAEXXZ) C:\Users\alexander\Documents\Visual Studio 2012\Projects\Win32Project3\ConsoleApplication1\Source.obj ConsoleApplication1
Error 3 error LNK2001: unresolved external symbol "public: __thiscall My_lib::My_lib(void)" (??0My_lib@@QAE@XZ) C:\Users\alexander\Documents\Visual Studio 2012\Projects\Win32Project3\ConsoleApplication1\Source.obj ConsoleApplication1
Error 4 error LNK1120: 2 unresolved externals C:\Users\alexander\Documents\Visual Studio 2012\Projects\Win32Project3\Release\ConsoleApplication1.exe ConsoleApplication1

Вот код и скрин настроек:

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "D:\Dropbox\source\some\my_lib\my_lib.h"
#pragma comment(lib, "libmy_lib.a")
#include <conio.h>
 
 
int main () {
    My_lib k;
    k.show_me();
    getch();
    return 0;
}
my_lib.h
C++
1
2
3
4
5
6
7
8
9
10
11
#ifndef MY_LIB_H
#define MY_LIB_H
 
class My_lib
{
public:
    My_lib();
    void show_me();
};
 
#endif // MY_LIB_H
my_lib.cpp
C++
1
2
3
4
5
6
7
8
#include "my_lib.h"
#include <iostream>
 
My_lib::My_lib() {}
 
void My_lib::show_me() {
    std::cout<<"hello wordl!"<<std::endl;
}
Как студию подружить со статической библиотекой скопилированой в MinGW ?

В MinGW всё норм и всё работает, так что либа рабочая, обе версии Release и копилирую тоже в Relese. В чём может быть проблема не подскажите?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2013, 21:26     Как студию подружить со статической библиотекой скопилированой в MinGW ?
Посмотрите здесь:

C++ Как пользоваться библиотекой?
Как подружить MinGW с wmain и wWinMain ? C++
Создание статической библиотеки в MinGw(code::blocks) C++
Как пользоваться стандартной библиотекой Очередей? C++
C++ Как работать с библиотекой VMIME?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.02.2013, 21:50     Как студию подружить со статической библиотекой скопилированой в MinGW ? #2
Проблема в различных соглашениях о name mangling. Это весьма геморройная вещь, поэтому из библиотек, которые планируется скрещивать с кодом, собираемым кем-то другим, обычно не экспортируют всякие классы и т. п. Только функции. И только с extern "C" перед определением:
C++
1
2
3
4
5
extern "C"
void func(int a, int b)
{
    // ...
}
чтобы отключить этот самый name mangling. Который часто мешает объединять не только скомпилированное различными компиляторами, а и даже разными версиями одного и того же. И всё равно это не всегда помогает в случае классов.

Это как раз одна из серьёзных проблем C++ — отсутствие стандартного ABI.
popelyuk
 Аватар для popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
16.02.2013, 22:01  [ТС]     Как студию подружить со статической библиотекой скопилированой в MinGW ? #3
а с .dll та же фигня?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
16.02.2013, 22:22     Как студию подружить со статической библиотекой скопилированой в MinGW ? #4
Ага. Это проблема вообще всех компиляторов Си++, а не конкретно библиотек.

Потому что 1) машинным кодам и инфраструктуре dll по барабану все эти локальные придумки Си++ вроде перегрузок, виртуальных методов и исключений; 2) им надо иметь какой-то универсальный, всем понятный интерфейс; 3) этим интерфейсом по историческим причинам в Windows и *NIX выбран Си (точнее, интерфейс как таковой вообще на уровне машинных кодов, просто Си как раз обладает стандартным способом преобразования своих конструкций вроде функций и структур в машинный вид); 4) стандартом Си++ не описывается единый способ преобразования придумок Си++ в конструкции Си, пригодные для экспорта библиотек, поэтому каждый компилятор мутит свой способ, который, естественно, не совместим со всеми остальными.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11846 / 6825 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
16.02.2013, 23:37     Как студию подружить со статической библиотекой скопилированой в MinGW ? #5
Советую почитать книгу "Технология COM" или как-то так она называется. В начале книги рассматривается вопрос создания кодабиблиотек минимально зависимого от транслятора.
Jupiter
16.02.2013, 23:55     Как студию подружить со статической библиотекой скопилированой в MinGW ?
  #6

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
"Технология COM"
лучше сразу застрелиться

Yandex
Объявления
16.02.2013, 23:55     Как студию подружить со статической библиотекой скопилированой в MinGW ?
Ответ Создать тему
Опции темы

Текущее время: 13:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru