Bicolor软件中 的 Makefile文件

CC = g++
GATB=../gatb-core-1.2.3-bin-Linux
# CFLAG = -O3 -Wall -I$(GATB)/include/ -L$(GATB)/lib/ -lgatbcore -lhdf5 -ldl -lz -lpthread -std=c++0x
CFLAG = -Wno-deprecated -I$(GATB)/include -L$(GATB)/lib -lgatbcore -lhdf5 -ldl -lz -lpthread -std=c++0x -O3

all:
	$(CC) iterative.cpp $(CFLAG) -o iterative
	$(CC) combine.cpp $(CFLAG) -o combine

iterative: iterative.cpp
	$(CC) iterative.cpp $(CFLAG) -o iterative

combine: combine.cpp
	$(CC) combine.cpp $(CFLAG) -o combine

 

CC = g++
GATB=../gatb-core-1.2.3-bin-Linux
# CFLAG = -O3 -Wall -I$(GATB)/include/ -L$(GATB)/lib/ -lgatbcore -lhdf5 -ldl -lz -lpthread -std=c++0x
CFLAG = -Wno-deprecated -I$(GATB)/include -L$(GATB)/lib -lgatbcore -lhdf5 -ldl -lz -lpthread -std=c++0x -O3

all:
	$(CC) iterative.cpp $(CFLAG) -o iterative
	$(CC) combine.cpp $(CFLAG) -o combine

iterative: iterative.cpp
	$(CC) iterative.cpp $(CFLAG) -o iterative

combine: combine.cpp
	$(CC) combine.cpp $(CFLAG) -o combine

set(CMAKE_CXX_FLAGS "-std=c++0x -Wno-deprecated")
就是在CXX_FLAGS中添加-std=c++0x 以及 -Wno-deprecated这两个选项

c++0x是新的C++意思。而-Wno-deprecated是表示 no-deprecated这类警告忽略

CFLAGS  :  编译选项, 通常为-O2 -Wall -I -L

要定义一 个宏,只要在一行的开始写下这个宏的名字,后面跟一个“=“和要设定这个变量的值。

以后引用这个变量时,写一个$符,后面是括号里的变量名。格式如下:

  $(宏名) 或${宏名}

调用库

调用外部函数库的方法,之所以管他叫调用,因为。。根本不用在外部引入。。服务器上都有的。。
库不是library嘛,就用-l+lib名去掉.so,比如说:

pthread就是-lpthread,zlib.h库就是-lz,math的库名是libm.so,显而易见就是-lz。

 

Makefile中-I -L -l之间的区别

我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:
例:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

上面这句表示在编译hello.c时:
-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,
寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include

-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,
寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

 -lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)

-l-->指定连接时,期望连接的库的名字

-L-->指定连接库的搜索路径

 

在makefile中经常会看到这些选项,简要说明其作用: 

-I后面紧跟着用户设定的编译器头文件查找路径

如:    -I/my_include_path/

-L后面紧跟着用户设定的编译器库文件查找路径

如:     -L/my_lib_search_path/

-l用来指明编译器要链接哪些库

如:   gcc test.c -o test  -lmylibname

 

介绍
gcc   - 参数

-I ( i 的大写)  :指定头文件路径(相对路径或觉得路径,建议相对路径)

-i               :指定头文件名字 (一般不使用,而是直接放在**.c 文件中通过#include<***.h> 添加)

-L              :指定连接的动态库或者静态库路径(相对路径或觉得路径,建议相对路径)

-l (L的小写):指定需要链接的库的名字(链接 libc.a :-lc       链接动态库:libc.so  : -lc   注意:-l后面直接添加库名省区“lib”和“.so”或“.a”  )

 

问题:
问题1:-l(L的小写)链接的到底是动态库还是静态库

答案:如果链接路径下同时有 .so 和 .a  那优先链接 .so  

问题2:如果路径下同时有静态库和动态库如何链接静态库

答案:使用显示链接,       gcc      -l:lib***.a    (将静态库的名字显示写出来)

或者在 gcc 编译的时候 加入参数 -static -lXXX, 则可以添加路径下面的静态库。

验证方法:

可以通过 ldd 命令查看生成的 目标文件链接的库,使用方法: ldd  ***.o

 
 

-lpthread和-pthread的区别

编译程序包括 预编译, 编译,汇编,链接,包含头文件了,仅能说明有了线程函数的声明, 但是还没有实现, 加上-lpthread是在链接阶段,链接这个库。
<stdio.h>等都是静态库,不需要做额外的表示,链接时会直接链接进代码里。

pthread是动态库,需要用-lpthread,所有的动态库都需要用-lxxx来引用

用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及头文件,一些老的书里说直接增加链接选项 -lpthread 就可以了

而gcc手册里则指出应该在编译和链接时都增加 -pthread 选项

 

编译选项中指定 -pthread 会附加一个宏定义 -D_REENTRANT,该宏会导致 libc 头文件选择那些thread-safe的实现;链接选项中指定 -pthread 则同 -lpthread 一样,只表示链接 POSIX thread 库。由于 libc 用于适应 thread-safe 的宏定义可能变化,因此在编译和链接时都使用 -pthread 选项而不是传统的 -lpthread 能够保持向后兼容,并提高命令行的一致性。

 

目前gcc 4.5.2中已经没有了关于 -lpthread的介绍了。所以以后的多线程编译应该用-pthread,而不是-lpthread。

 

HDF

HDF(Hierarchical Data Format)是一种设计用于存储和组织大量数据的文件格式,最开始由美国国家超算中心研发,后来由一个非盈利组织HDF Group支持.HDF支持多种商业及非商业的软件平台,包括MATLAB、Java、Python、R和Julia等等,现在也提供了Spark.其版本包括了HDF4和现在大量用的HDF5,


linux下如何运行c++程序(包括调用外部函数库)

运行c++程序
(1)事实证明gcc是理解不了c++的。
用g++运行你的程序,比如:g++ main.cpp
g++产生一个.out文件,如果跳转到下一句就意味着执行成功(废话)。这时如果没有指定名字的话,就是a.out文件(用-o 指定编译后的名字

(2)./a.cout就能执行那个c++程序了。

(3)   gcc iterative.cpp -o iterative

g++ -Wall iterative.cpp -o iterative

 g++ iterative.cpp

调用库
调用外部函数库的方法,之所以管他叫调用,因为。。根本不用在外部引入。。服务器上都有的。。
库不是library嘛,就用-l+lib名去掉.so,比如说:

pthread就是-lpthread,zlib.h库就是-lz,math的库名是libm.so,显而易见就是-lz。

这个可以用命令ldconfig –p自己查看已缓存的,还是要具体看一下库名的。
所有外部库,或者这样:vim /etc/ld.so.conf
(大概会显示include ld.so.comf.d/*conf
进入目录查看文件ll ld.so.conf.d/ 就好啦)

编译时出现了如果出现这种错误信息:

error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
提示上加上-std=c++0x或者-std=gnu++0x选项(这个是c++的版本问题)。加上就解决了~

总结
最后,附上我自己的那个c++程序的运行命令:
g++ main.cpp -std=c++0x -lpthread -lboost_regex -lz -o pro

其实我这篇写的也不是很清楚,并且只有说一些操作问题,可能是我太小白了吧,还是要好好学习啊。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangchuang2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值