Linux Make问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux Make问题相关的知识,希望对你有一定的参考价值。

由于安装GCC的需要,把Linux的make由3.79升级到3.81,升级一路顺利,但是升级完成后make -v 依然显示是3.79,该怎么配置使3.81生效?(系统时RH 9.0的)求高人指点,正确答案可追分!

修改它的环境变量试试,下面是有关文章,你看看。
gcc环境变量
1.运行时动态库的搜索路径
方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径
方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)
方法三:在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径.
这是通过gcc 的参数"-Wl,-rpath,"指定(如例3所示).当指定多个动态库搜索路径时,路径之间用冒号":"分隔)
四:默认的动态库搜索路径/lib
五:默认的动态库搜索路径/usr/lib

动态库的搜索路径搜索的先后顺序是:
(1).编译目标代码时指定的动态库搜索路径;
(2).环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
(3).配置文件/etc/ld.so.conf中指定的动态库搜索路径;
(4).默认的动态库搜索路径/lib;
(5).默认的动态库搜索路径/usr/lib.

2※预处理(preprocessing),编译(compilation),汇编(assembly)和连接(linking)
※include的header文件,连结数据库,系统定义,总共有下列来源指定gcc去那找.
当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()
写在specs内的
后来用-D -I -L指定的
gcc环境变量设定(编译的时候)
ld.so的环境变量(这是run time的时候)
===========================================
1
===========================================
1.头文件
gcc 在编译时如何去寻找所需要的头文件 :
※所以header file的搜寻会从-I开始
※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
※再找内定目录
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include
库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

2.库文件
cos()等函式库的选项要多加 -lm
编译的时候:
※gcc会去找-L
※再找gcc的环境变量LIBRARY_PATH
※再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
================================================
2
================================================2.利用Linux系统上已有的开发库
(1).查看库文件提供了哪些调用
可以用nm命令自己查看库文件提供了哪些调用
(2).通过头文件查看函数的定义
================================================
3
================================================
3.gcc选项
总体选项 (Overall Option) :(-c(生成目标但不连接) -S(汇编) -E(预处理) -o file(生成指定的文件) -pipe -v(显示过程) -x language (设定文件所使用的语言,使后缀名无效`c', 可用参数`objective-c', `c-header', `c++', `cpp-output', `assembler', and `assembler-with-cpp'))
语言选项 (LANGUAGE OPTIONS) :(-ansi 只支持 ANSI 标准的 C 语法.这一选项将禁止 GNU C 的某些特色)
预处理器选项 (Preprocessor Option) :(-Aassertion -C -dD -dM -dN -Dmacro[=defn] -E -H -idirafter dir -include file -imacros file -iprefix file -iwithprefix dir -M -MD -MM -MMD -nostdinc -P -Umacro 相当于C语言中的#undef macro -undef -DMACRO 以字符串“1”定义 MACRO 宏, -DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏)
汇编器选项 (ASSEMBLER OPTION) :(-Wa,option )
连接器选项 (LINKER OPTION) :(-llibrary -nostartfiles -nostdlib -static -shared -symbolic -Xlinker option -Wl,option -u symbol )
目录选项 (DIRECTORY OPTION) :(-Bprefix -Idir -I- -Ldir)
警告选项 (WARNING OPTION) :(-w 不生成任何警告信息,-Wall 生成所有警告信息)
调试选项 (DEBUGGING OPTION) :(-a -dletters -fpretend-float -g -glevel -gcoff -gxcoff -gxcoff+ -gdwarf -gdwarf+ -gstabs -gstabs+ -ggdb -p -pg -save-temps -print-file-name=library -print-libgcc-file-name -print-prog-name=program )
优化选项 (OPTIMIZATION OPTION) :(-O0不进行优化处理,-O或-O1优化生成代码 -O2进一步优化 -O3比-O2更进一步优化,包括inline函数)
目标机选项 (TARGET OPTION) :(-b machine -V version )
机器相关选项 (MACHINE DEPENDENT OPTION):(-m486 针对 486 进行代码优化)
代码生成选项 (CODE GENERATION OPTION) :(-fpic -fPIC)
参考技术A 首先确定你怎么升级的, 你升级的3.81版本在那个目录里面, 然后确定你升级的哪个版本是不是正常工作, 假设你升级的make放在了/usr/local/bin, 则实施 /usr/local/bin/make -v 是不是能正常运行, 如果能正常运行, 只要在环境变量 PATH里面加上 /usr/local/bin 就可以了, 而且应该把这个路径放在 PATH的前面。 如果不能正常运行, 就是你升级安装的有问题, 可以确定的是, 你的升级, 没有把原来的版本覆盖掉! 参考技术B 你可能把新的make装到/usr/local/bin目录下了,这样系统就有两个版本的make
/usr/bin/make
/usr/local/bin/make
你可以用全路径,或将/usr/bin/make改名,或修改PATH中路径的搜索顺序本回答被提问者采纳

make---linux和windows格式

【中文标题】make---linux和windows格式【英文标题】:make---linux and windows formats 【发布时间】:2009-05-21 11:59:05 【问题描述】:

我遇到了一个大问题..我在 Linux 操作系统中使用 linux make 文件编译了我的 c 文件。

我想通过命令提示符使用相同的 make 文件在 Windows 中编译相同的文件。为此,我也有 nmake 实用程序和 Cygwin 实用程序。

我已经用简单的程序和简单的 make 文件成功地做到了..

但是当我使用复杂的 C 文件和复杂的 make 文件时无法编译。

我已将 linux make 文件中的 '/' 更改为 windows 中的 '\'?还有什么变化吗?

我想知道'windows中是否有任何特殊的make文件格式?'

还有它们之间的区别..

我真的很需要那个......

【问题讨论】:

你确定问题出在makefile的格式上吗?您的 makefile 可能会引用一些 Windows 上不存在的 Linux 库或尝试运行某些东西,例如对于与 MySQL 的链接,通常运行“mysql_config --libs”以获取 MySQL 库列表。 NMake 与 make 的任何 *nix 版本的不兼容比各种 *nix 版本彼此之间的不兼容。尽管可以编写与 NMake 和 make 一起使用的文件,但不值得付出努力,因为有几个真正的 make 可用于 Windows。一旦选择了make,就会出现其余命令的问题。 【参考方案1】:

不幸的是,nmake 只是从 make 中得到了松散的启发,而且他们并没有把很多重要的事情做对。到目前为止,最简单的做法是从在两个平台上使用相同风格的 make 开始。

在 linux 上,Gnu make 是默认和最佳选择。

在 Windows 上,有几个 Gnu make 的来源,有一些怪癖可供选择。就个人而言,我主要使用native win32 build of Gnu make from the GnuWin32 project。您可能想看看项目的其他包,因为其他一些包也很有用。

其他来源是Cygwin 和MinGW32/MSYS。

Cygwin 是在 Windows 内核之上提供 *nix 兼容环境的可靠尝试。它由一个 DLL 组成,该 DLL 导出了大量通过 Windows API 实现的 *nix(尤其是 POSIX)系统调用。该 DLL 对磁盘安装也有自己的想法,并且更喜欢 *nix 样式的路径名。 DLL 本身是 GPL 许可的(尽管商业使用许可是收费的),并且在 Cygwin 环境中构建的程序默认需要它,因此这是一个需要考虑的因素。另一个因素是 Cygwin 对普通 Windows 用户不友好,因此基于它的开发项目通常对于非 unix 用户来说很难处理。然而,对于跨平台开发人员来说,Cygwin 非常有用,因为它可以为您提供 Makefile 所需的所有常见的可疑实用程序,并且它包括 MinGW32 本机针对 Windows 的 GCC 以及针对 Cygwin 环境的 GCC。

MinGW32 是一个移植项目,它在移植 GCC 编译器以作为本机 Windows 可执行文件运行方面做得非常好。如果与它们提供的头文件一起使用,则可以通过现代 Windows 安装附带的 C 运行时 DLL 使用几乎所有 Windows API。

MSYS 是 Cygwin 的轻量级分支,它包含一组最小的实用程序(以 *nix shell 开头),通常假定典型的 *nix Makefile 存在这些实用程序。与 Cygwin 不同,MSYS 被配置为默认目标是本机 Windows API。

我在这里试图暗示并且可能应该直截了当地说明的是,您的兼容性问题不会以 make you use 的方言结束。

Makefile 语言本身高度依赖于可用的命令 shell,大多数严重的项目 Makefile 最终都使用许多 *nix 核心实用程序,例如 cp 和 rm。

我强烈建议从 GnuWin32 构建开始,并安装 MinGW32 和 MSYS。那么编写一个在 MSYS 和 linux 下都可以工作的 Makefile 相对容易,并且只需要少量的特定于平台的逻辑。

【讨论】:

【参考方案2】:

您应该考虑使用 CMake 进行跨平台制作,但您真正的问题是您不必将“/”更改为“\”。如果您在 cygwin 或 msys(推荐)下运行,则应该为您处理。

【讨论】:

更不用说 Windows 将正斜杠解释为目录分隔符和反斜杠一样,因此(除非行为不佳的程序搞砸了自己的路径解析)“命令 C:/some/ thing" 与 "command C:\some\thing" 的作用相同。【参考方案3】:

NMake 是一个 windows 工具,将只解析 windows 样式的路径,即带有驱动器号和反斜杠的路径。因此,您应该使用与 cygwin 一起安装的 GNU Make。

【讨论】:

【参考方案4】:

nmake 应该可以读取您的 makefile,差异通常在 make 版本之间而不是操作系统之间。

最大的问题是您的目标平台实际上是什么,您是想让这些代码在 Windows 中原生运行还是希望在 Cygwin 下运行它?

【讨论】:

谢谢..我正在使用 NMAKE.EXE 1.50 ...我认为这就是问题所在。我还在命令提示符下给出了路径集 PATH=C:\cygwin\bin;%PATH% 。我想知道它们之间是否有任何格式/语法差异? 我不太了解nmake,所以请咨询以下一位。如果可能的话,我建议您从该答案中删除已接受的答案并将其应用于以下答案之一。他们当然比我更值得接受。【参考方案5】:

在两个平台上都使用 gnumake。我愿意。我已经很多年没有接触过 Visual C 了。

【讨论】:

【参考方案6】:

nmake有自己的格式而不是windows本身,所以makefile格式与make工具有关,而不是与操作系统有关。对于简单的事情,g(nu)make 和 nmake 的格式相似,正如人们在考虑仅使用 gmake 之前建议的那样。

【讨论】:

只针对非常基本的东西

以上是关于Linux Make问题的主要内容,如果未能解决你的问题,请参考以下文章

make---linux和windows格式

linux 源代码程序终端安装make后出现 make: *** 没有指明目标并且找不到 makefile。 停止。

linux使用make命令编译时出现啥提示证明make成功呢?

linux 中make命令出错是怎么回事了

Linux makefile问题

ubuntu12..4编译问题:当做到make -j4后出现如下: