Подключение .obj файла VS 2017

199
19 ноября 2021, 15:50

При попытке подключения .obj файла возникает ошибка LNK1107 недопустимый или поврежденный файл: не удается прочитать по 0xDF HLL D:\Aleksey\Учеба\C++\HLL\HLL\add_matrix.OBJ

Код проекта

#pragma comment(lib, "add_matrix")
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
typedef std::vector<std::vector<int>> matrix;

extern "C"
{
    char __cdecl add_matrix(const matrix& a, const matrix& b, matrix& c, const int size);
} 

int main()
{
    std::srand(unsigned(std::time(NULL)));
    setlocale(LC_ALL, "ru");
    int size;
    std::cout << "Введите размерность матриц: ";
    std::cin >> size;
    matrix a(size, std::vector<int>(size, 0));
    matrix b (size, std::vector<int>(size, 0));
    matrix c (size, std::vector<int>(size, 0));

    for (int i = 0; i < size; i++)
    {
        std::for_each(a[i].begin(), a[i].end(), [](int& x) {x = rand() % 10 + 1; });
        std::for_each(b[i].begin(), b[i].end(), [](int& x) {x = rand() % 10 + 1; });
    }

    char res = add_matrix(a, b, c, size);
    std::cin.get();
    return 0;
}   

Код файла add_matrix.asm(еще не дописал, хотел посмотреть в дебаге из вижуалки)

.486
.model flat
.data
    i db 0
.code
PUBLIC add_matrix
add_matrix proc near
    push ebp
    mov ebp, esp
    ;---------------------------
    mat_a equ dword ptr [ebp+8]
    mat_b equ dword ptr [ebp+12]
    mat_c equ dword ptr [ebp+16]
    n equ dword ptr [ebp+20]
    ;---------------------------
    xor eax, eax
    xor ebx, ebx
    mov ebx, mat_a
    ;
    pop ebp
    ret
add_matrix endp
end
Answer 1

Неудивительно, что Visual Studio не понимает объектный файл, порожденный tasm. Для Visual Studio, видимо, придется пользоваться MASM.

В ASM файле укажите

.model flat,C

чтобы способ именования внешних символов совпадал с extern "C".

Вся ваша возня с библиотеками и "подключение объектного файла" не обязательна. Вы можете просто добавлять MASM файлы в Visual Studio проект, как обычные C или C++ файлы. Они будут компилироваться MASM и собираться линкером по общей схеме. Ничего никуда не надо дополнительно подключать (если ваша цель не состоит в том, чтобы создать внешнюю библиотеку).

Каким образом (и зачем) вы собрались "разбирать" std::vector в ассемблере, правда, не ясно. Но то, что вы пока написали, прекрасно компилируется и собирается в Visual Studio.

READ ALSO
Запуск приложения Windows Store из классического desktop приложения

Запуск приложения Windows Store из классического desktop приложения

Как из обычного классического desktop приложения написанного на C++ запустить приложение установленное из Windows Store? По аналогии с QProcess

160
Код шаблона в C++

Код шаблона в C++

Существует ли способ построить в классе группу "одинаковых" методов, но использующих каждый одно уникальное свойство/параметр, при помощи...

95
Как реализовать решение задачи ЕГЭ на C++?

Как реализовать решение задачи ЕГЭ на C++?

Возник такой вопрос: как реализовать решение следующей задачи на C++? Вводятся число N - количество строкВ каждой из N строк через пробел вводятся...

333
Как повысить привилегии приложения (UAC)

Как повысить привилегии приложения (UAC)

Делаю приложение, которое запускается на Windows 7/10 от пользователя с правами администратораПри этом запускается оно в обычном режиме (с ограниченными...

178