Arhn - архитектура программирования

Создание библиотеки импорта, C++/VisualStudio2013

Я создаю набор библиотек DLL C++ и их библиотек импорта в VisualStudio (2013). До сих пор все они были сгенерированы компоновщиком одновременно. Мои библиотеки DLL используют символы из других библиотек, которые включены в качестве дополнительных зависимостей в редакции свойств/ссылки.

Иногда генерация DLL завершается сбоем из-за отсутствия библиотек импорта, что меня вполне устраивает, но в этом случае также нет сгенерированного файла .lib. Я хотел бы сгенерировать библиотеки импорта (моих DLL), даже если библиотеки DLL не могут быть выполнены, чтобы позволить другим проектам полагаться на символы, которые я буду экспортировать, прежде чем я смогу предоставить весь материал.

Я нашел обходной путь через командную строку события предварительной ссылки:

  • LIB /DEF:(...)\myLib.def /OUT:(...)\myLib.lib $(IntDir)*.obj

Это создает именно то, что мне нужно, когда у меня есть файл .def.

Проблема в том, что у меня чаще всего нет такого файла .def, а вместо этого я полагаюсь на инструкции __declspec(dllexport), и в таком случае я не нашел способа получить правильный результат.

Я пытался:

  • LIB /OUT:(...)\myLib.lib $(IntDir)*.obj (#1)
    Это создает (статический?) файл lib, а не библиотеку импорта, не то, что мне нужно.

  • LIB /DEF /OUT:(...)\myLib.lib $(IntDir)*.obj (#2)
    Это завершается ошибкой 1104 из-за отсутствия (других) библиотек импорта.

Что еще более озадачивает меня, так это то, что командная строка (# 2) не работает с библиотеками, которые должны быть здесь (на самом деле они найдены компоновщиком). Мне интересно, должен ли я предоставлять полные аргументы командной строки LINK команде LIB, и в этом случае это было бы невозможно.

Я не большой специалист по инструментам компиляции/связывания, боюсь, я, вероятно, делаю довольно неправильные вещи...

Кто-нибудь знает простой способ удовлетворить мою потребность без использования файла .def? Есть ли в компоновщике возможность запрашивать создание библиотеки импорта из объявленных символов __declspec(dllexport) и генерировать ее, даже если DLL не может связать?


Ответы:


1

Это не удается из-за ошибки 1104 из-за отсутствия (других) библиотек импорта.

Редактировать: о, я понял. Файлы .obj содержат /DEFAULTLIB: внутри них и lib жалуются. Используйте /NODEFAULTLIB

hasunresolved.c:

#pragma comment(lib, "missinglib.lib")

void missingfunc();

__declspec(dllexport)
void dllfunc() {
    missingfunc();
}

usedll.c

__declspec(dllimport)
void dllfunc();

int main() {
    dllfunc();
    return 0;
}

в командной строке VS:

cl -c hasunresolved.c

lib /def /OUT:test.lib hasunresolved.obj
rem this prints: LIB : fatal error LNK1104: cannot open file 'missinglib.lib'

lib /NODEFAULTLIB /def /OUT:test.lib hasunresolved.obj

cl usedll.c test.lib
dumpbin /IMPORTS:test.dll usedll.exe

вывод:

Dump of file usedll.exe
    test.dll
                    0 dllfunc
06.03.2014
  • ЭТО ОНО ! По какой-то причине я всегда использовал /NODEFAULT только для внутренних библиотек MS... Моя ошибка. 06.03.2014
  • Я попытался добавить эту опцию в сам компоновщик, чтобы не добавлять команду события перед связыванием, пока это не сработало (так много опций), но это не имеет большого значения... Большое спасибо за вашу помощь. 06.03.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..