скажите, работает ли make на windows или linux - PullRequest
4 голосов
/ 24 октября 2011

Есть ли способ узнать в make-файлах, работает ли GNU make на ОС Linux или Windows?

Я создал скрипт bash, который генерирует make-файл для сборки моего приложения, и он отлично работаетна моей машине Debian.Я хочу попробовать построить его на MinGW / MSYS, но проблема в том, что мне нужно собрать и запустить некоторые тестовые программы, которые проверяют ошибки в исходном коде, и чтобы запустить его в Windows, я должен добавить суффикс .exe.

Ответы [ 2 ]

4 голосов
/ 08 февраля 2013

UPDATE
Пожалуйста, прочтите этот похожий, но лучший ответ:
https://stackoverflow.com/a/14777895/938111


makegcc) можно легко установить в MS-Windows с помощью Cygwin или MinGW .

Как говорит @ldigas, make может обнаружить платформу, используя UNAME:=$(shell uname) (команда uname также устанавливается установщиком Cygwin или MinGW).

Ниже я приведу полный пример, основанный на makegcc), чтобы объяснить, как создать общую библиотеку: *.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";
}

сборка

Fix Makefiles copy (заменить начальные пробелы табуляцией).

> 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
2 голосов
/ 24 октября 2011
Команда

uname должна дать вам основную информацию об ОС. Можете ли вы использовать это, а затем сделать IF на основе возвращаемого значения?

Чтобы не переписывать все здесь, эти два вопроса могут вас заинтересовать
1. OS обнаруживает make-файл
2. Makefile, который различает Windows и Unix-подобные системы

...