判断 make 是在 windows 还是 linux 上运行
Posted
技术标签:
【中文标题】判断 make 是在 windows 还是 linux 上运行【英文标题】:tell if make is running on windows or linux 【发布时间】:2011-12-14 04:21:15 【问题描述】:有没有办法在 makefile 中知道 GNU make 是在 linux 操作系统还是 windows 操作系统上运行?
我已经构建了一个 bash 脚本,它生成了一个用于构建我的应用程序的 makefile,它在我的 Debian 机器上运行良好。我想尝试在MinGW/MSYS上构建它,但问题是我必须构建和运行一些测试程序来检查源代码中的错误,并且要在Windows上运行它,我必须添加.exe后缀。
【问题讨论】:
是时候使用 Maven。它独立于平台。 要回避这个特定问题,您可以在 all 平台上包含 .exe 后缀; Linux 不介意它是否存在,只要您记得在运行程序时包含它即可。 这是***.com/questions/714100/os-detecting-makefile的副本 @Michaelangel007 不同意这是重复的。我在不同操作系统上搜索了这个关于 .exe 的特定问题,但谷歌首先显示了你提到的问题,它没有直接答案,只是识别操作系统的各种技术的集合,而不是具体如何选择性地添加“.exe”文件扩展名仅适用于使用它的平台。其他技术可能允许针对类似问题提供更广泛、更通用的解决方案,但它与重复回答甚至询问这个特定问题不同。 【参考方案1】:uname 命令应该为您提供有关操作系统的基本信息。能不能用它,然后根据返回值做一个IF?
为了不重写所有内容,这里 - 这两个问题可能会引起您的兴趣1. OS detecting makefile2. Makefile that distincts between Windows and Unix-like systems
【讨论】:
谢谢,我认为这应该可行。也许添加一些忽略版本的代码,以便它可以在不同的版本上工作【参考方案2】:更新 请阅读此类似但更好的答案:https://***.com/a/14777895/938111
make
(和gcc
)可以使用Cygwin或MinGW轻松安装在MS-Windows上。
正如@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
【讨论】:
以上是关于判断 make 是在 windows 还是 linux 上运行的主要内容,如果未能解决你的问题,请参考以下文章
shell脚本怎么判断系统是linux、windows还是esxi
linux已经安装了php扩展uuid 但是还报Call to undefined function uuid_make()这个错误,为甚么呢。