Скажите, работает ли make на windows или linux
Есть ли способ узнать в make-файлах, работает ли GNU make на ОС Linux или Windows?
Я создал bash-скрипт, который генерирует make-файл для сборки моего приложения, и он отлично работает на моей машине Debian. Я хочу попробовать построить его на MinGW/MSYS, но проблема в том, что мне нужно собрать и запустить некоторые тестовые программы, которые проверяют ошибки в исходном коде, и чтобы запустить его в Windows, я должен добавить суффикс.exe.
2 ответа
Команда uname должна дать вам основную информацию об ОС. Можете ли вы использовать это, а затем сделать IF на основе возвращаемого значения?
Чтобы не все переписывать, вот - эти два вопроса могут вас заинтересовать
1. ОС обнаруживает make-файл
2. Makefile, который различает Windows и Unix-подобные системы
ОБНОВИТЬ
Пожалуйста, прочтите этот похожий, но лучший ответ:
/questions/37034797/os-obnaruzhivaet-make-fajl/37034819#37034819
make
(а также gcc
) может быть легко установлен на MS-Windows с использованием Cygwin или MinGW.
Как говорит @ldigas, make
может обнаружить платформу, используя UNAME:=$(shell uname)
(команда uname
также устанавливается установщиком Cygwin или MinGW).
Ниже я приведу полный пример, основанный на make
(а также gcc
), чтобы объяснить, как построить общую библиотеку: *.so
или же *.dll
в зависимости от платформы.
Пример простой / простой для понимания:-)
Давайте посмотрим на пять файлов:
├── app
│ └── Makefile
│ └── main.c
└── lib
└── Makefile
└── hello.h
└── hello.c
Makefiles
app/Makefile
app.exe: main.o
gcc -o $@ $^ -L../lib -lhello
# '-o $@' => output file => $@ = the target file (app.exe)
# ' $^' => no options => Link all depended files
# => $^ = main.o and other if any
# '-L../lib' => look for libraries in directory ../lib
# '-lhello => use shared library hello (libhello.so or hello.dll)
%.o: %.c
gcc -o $@ -c $< -I ../lib
# '-o $@' => output file => $@ = the target file (main.o)
# '-c $<' => COMPILE the first depended file (main.c)
# '-I ../lib' => look for headers (*.h) in directory ../lib
clean:
rm -f *.o *.so *.dll *.exe
lib/Makefile
UNAME := $(shell uname)
ifeq ($(UNAME), Linux)
TARGET = libhello.so
else
TARGET = hello.dll
endif
$(TARGET): hello.o
gcc -o $@ $^ -shared
# '-o $@' => output file => $@ = libhello.so or hello.dll
# ' $^' => no options => Link all depended files => $^ = hello.o
# '-shared' => generate shared library
%.o: %.c
gcc -o $@ -c $< -fPIC
# '-o $@' => output file => $@ = the target file (hello.o)
# '-c $<' => compile the first depended file (hello.c)
# '-fPIC' => Position-Independent Code (required for shared lib)
clean:
rm -f *.o *.so *.dll *.exe
Исходный код
app/main.c
#include "hello.h" //hello()
#include <stdio.h> //puts()
int main()
{
const char* str = hello();
puts(str);
}
lib/hello.h
#ifndef __HELLO_H__
#define __HELLO_H__
const char* hello();
#endif
lib/hello.c
#include "hello.h"
const char* hello()
{
return "hello";
}
Сборка
исправлять Makefiles
скопировать (заменить начальные пробелы табуляцией).
> sed -i 's/^ */\t/' */Makefile
make
Команда одинакова на обеих платформах. Это вывод на MS-Windows (удалены ненужные строки).
> cd lib
> make clean
> make
gcc -o hello.o -c hello.c -fPIC
gcc -o hello.dll hello.o -shared
> cd ../app
> make clean
> make
gcc -o main.o -c main.c -I ../lib
gcc -o app.exe main.o -L../lib -lhello
Бег
Приложение должно знать, где находится общая библиотека.
В MS-Windows простой / простой / глупый способ - скопировать библиотеку, в которой находится приложение:
> cp -v lib/hello.dll app
`lib/hello.dll' -> `app/hello.dll'
В Linux используйте LD_LIBRARY_PATH
переменная окружения:
> export LD_LIBRARY_PATH=lib
Командная строка запуска и вывод одинаковы на обеих платформах:
> app/app.exe
hello