С Mingw создал статическую ссылку на библиотеку в проекте VS2008 - PullRequest
1 голос
/ 06 января 2012

Что я пытаюсь сделать?...

Сначала создайте статическую библиотеку с помощью компилятора MinGW g ++.

Итак, простыми примерами файлов являются ...

test.h

#ifndef EXAMPLE_H
#define EXAMPLE_H

#include <iostream>

#ifdef __cplusplus
extern "C" {
#endif

#ifdef EXPORT_DLL_FUNCT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

    DLL_API void __stdcall whatever( int a, int b );   

#ifdef __cplusplus
}
#endif

#endif  // EXAMPLE_H

test.cpp

#include "test.h"

__stdcall void whatever( int a, int b ) {
    std::cout << "whatever printout !!!" << std::endl;
    int c = a + b;
}

Когда я использую команды компиляторов:

g++ -c -DEXPORT_DLL_FUNCT test.cpp -o test.o

и

g++ -shared test.o -o libtest.dll -Wl,--out-implib=libtest.a

создаются файлы "libtest.dll" и "libtest.a".Зачем нужны оба?Потому что, если вы собираетесь использовать библиотеку в проекте VS2008 (MSVC ++), необходимы оба файла - я читал об этом на сайте MinGW.

Далее ... Я создал проект консольного приложения Win2008 Win32, который будет вызывать функцию«что угодно» из библиотеки.

main.cpp

#include "../mingw/test.h"
#include <iostream>


void main(void)
{
    std::cout << "\n*** start ***" << std::endl;

    whatever(3, 2);

    std::cout << "\n*** end ***" << std::endl;

}

В VS2008: «Свойства -> Компоновщик -> Общие -> Дополнительные каталоги библиотеки» Я добавил путь к ранее созданномуБиблиотека и в "Свойства -> Линкер -> Ввод -> Дополнительные зависимости" я добавил файл "libtest.a".Когда я собираю проект, компиляция и компоновка в порядке, файл exe генерируется, но когда я пытаюсь запустить exe ... происходит ошибка сегмента (да, "libtest.dll" находится в той же папке, что и файл .exe) !!!Я не имею понятия почему?«__stdcall» используется в коде, поэтому не должно быть проблем с переносом данных в стек ...

Есть предложения, пожалуйста?

Ответы [ 3 ]

1 голос
/ 09 января 2012

Спасибо за ваш ответ.Ваши предложения мне очень помогли!Давайте посмотрим решение сейчас ... Во-первых, отчасти это была моя бесцеремонность ... Я просто "забыл" проверить, работает ли в любом случае .exe, когда bulid в VS2008 в режиме отладки.Ответ ДА.:) Так что, когда в режиме отладки, верхний пример работает хорошо!Но все равно не работает в режиме Release.Что ж, вот решение и для режима Release: в проекте VS2008 установите Linker -> Optimization-> References to No (/ OPT: NOREF) .Вот и все ...

0 голосов
/ 12 февраля 2014

Хотя библиотека импорта, созданная GCC, соответствует стандарту «Архив» (.a или .lib для vc), а объектные файлы в архиве также соответствуют стандарту COFF, она не совместима с VC. .

Я изучил библиотеку импорта, созданную с помощью vc, implib sdk и gcc, и обнаружил, что библиотеки, созданные с помощью gcc и implib sdk, очень похожи. Наиболее впечатляющим отличием является то, что имена членов (объектный файл внутри архива) одинаковы для implib sdk и различаются для gcc. Линкер VC не отказывается связываться с библиотекой импорта gcc, но будет сформирован искаженный exe.

Вы можете взглянуть на implib sdk, он может создать библиотеку импорта, которая работает с vc. Но некоторые ограничения очень раздражают, такие как длина имени файла dll, кодировка и т. Д.

Использование компоновщика vc для создания библиотеки импорта - хороший способ. Созданная библиотека импорта гарантированно совместима с вашим исходным кодом. В вашей ситуации вы можете попробовать:

  1. напишите файл .def, подобный этому

    LIBRARY libtest
    EXPORTS
        whatever@8
    

    сохранить как libtest.def

  2. сделать библиотеку импорта с компоновщиком:

    link /lib /out:libtest.lib /def:libtest.def
    
  3. Теперь у вас есть libtest.lib, используйте его вместо этого.

0 голосов
/ 06 января 2012

У меня нет хорошего объяснения этому, но с VS 2010, если я добавил /Zi, /ZI или /Z7 в строку компиляции VS (все опции для включения символов отладки), приложение запускается правильно и вызывает функцию в библиотеке MinGW. Сначала я думал, что это означает, что оптимизатор в VS вызывает проблемы, однако указание /Od не предотвращает ошибку сегментации.

...