• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Msvs 2005 и Nmake

  • Автор темы floke
  • Дата начала
F

floke

Нужно скомпилировать программу, причем часть компилирует VS, часть утилита nmake через написанный makefile, после чего VS начинает линковать полученные файлы. Реализовано это следующим образом(на простом примере):
Фаил, который компилирует VS:
test_make.cpp
C++:
extern void prnt(int);
int main()
{
prnt(5);
return 0;
}

2 файлики которые компилирует nmake через makefile
myhead.h
C++:
#ifndef __MYHEAD_H_
#define __MYHEAD_H_

void prnt(int);

#endif
mysrc.cpp

C++:
#include "myhead.h"
#include <stdio.h>

void prnt(int i)
{

printf("my number from mysrc %d " , i);
}
компиляция последних двух запускается через bat фаил(запускается он vs через свойства проекта -> build events -> pre build events)

На этапе линковки возникает ошибка, мол линкер не находии метод prnt(int) . Заметил пару особенностей:
1) если компилить проект из командной строки - всё прекрасно компилиться и линкуется
2) если компилить проект из VS (весь проект, то есть добавить myhead и mysrc к проекту и сделать build ) - линковку проходит, запускается
3) если компилить из VS проект как в п2 и потом подменить полученные mysrc.obj и mysrc.sbr файлы на те, которые получаться в результате компиляции из коммандной строки(при помощи того же Makefile) то проект линкуется из VS успешно

Как мне показалось, VS ищет extern функцию только в файлах проекта(а мне бы нужно, чтоб метод искался среди всех файлов, содержащихся в папке).
 
F

floke

Сомневаюсь что так можно.

Почему бы тебе не компилировать все из VS или все из командной строки??

бывает, нужно писать врапперы к разным программам(например скомпилить исходники UNIX приложения под win или ещё чего по-хуже, например использовать один графический интерфейс для разных приложения). Так вот чтобы каждый раз не создавать новыйй проект, можно сделать один, содержащий лишь наш враппер и универсальный makefile. Проект в VS при компиляции(перед компиляцией или перед линковкой) будет запускать nmake, которому скормиться makefile. В результате, на момент запуска линковщика из VS, у нас уже будут все *.obj *.sbr и прочие файлы, необходимые для построения проекта.

Ответ на свой вопрос я уже нашел: в свойствах проекта нужно было в параметрах линковщика в additional depend... указать папку, которая содержит ТОЛЬКО файлы, получившиеся после работы makefilе(то есть необходимо, чтобы *.obj ... файлы проекта и *.obj файлы после nmake /f makefile.mak были в разных папках). Причем путь проиписывается так: .\.....\*.obj , то есть все файлы из папки. ТОгда всё будет ок.

Да, кстати, может кто-нить столкнется... в makefile в ситтуации, подобной моей, обращайте внимание на параметры компилятора. А то я недельку посидел с левыми ошибками и redefinition в стандартных библиотеках
 
L

lazybiz

VS особо не пользуюсь, но буду иметь в виду.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!