gcc使用笔记(opensuse)

github原文链接(welcome give me a star on github):
https://github.com/lianggx6/Tools/wiki/gcc使用笔记(opensuse)

安装gcc和g++

zypper install gcc  # 安装gcc
zypper install gcc-c++  # 安装g++

编译与运行

  • 编译成功之后直接运行输出文件即可
  • 对于多文件编译,只要在同一文件夹下即可。特别地,对于定义和实现分文件的类,编译时需将类实现的CPP文件一同编译
g++ test.cpp  # 编译test.cpp,默认生成a.out可执行文件
g++ test.cpp -o test  # 编译test.cpp,以test文件名生成可执行文件
g++ *.cpp -o test  # 编译该目录下所有cpp文件,多文件编译时简单写法

Linux下动态链接库的使用(.so文件)

  1. 生成动态链接库(.so文件)
    编写好相应的头文件及cpp文件,执行如下命令
# 生成目标文件,此时要加编译器选项-fpic
# -fPIC 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。
g++ -fPIC -c head.cpp  

# 然后,生成动态库,此时要加链接器选项-shared
# 注意动态库的命名规则一定要是 lib*.so, 即以lib开头,.so结尾,*为模块名
# 这种命名主要是在之后编译调用动态库时,Linux会以这个命名规范去寻找动态库
g++ -shared -o libmath.so head.o

# 以上两个步骤可以合并为一个命令
g++ -fPIC -shared -o libnmath.so head.cpp 
  1. 调用动态链接库(.so文件)
g++ test.cpp -L /home/c++/ -lmath
# 此为调用动态链接库编译生成可执行文件命令,该命令有两个参数-L和-l    
# 其中-L指定编译时所调用动态库所在的目录,如果在同一目录下可省略
# -l指定要调用的动态链接库模块,其为生成动态库时提到的模块名,就是那个*
# 注意编译时调用-L指定的目录在运行时并不有效,运行时的库配置见下方
# 编译后生成可执行文件 a.out,可使用如下命令查看a.out的依赖
ldd a.out
# 如果我们不配置自定义动态库,调用上述命令后会发现这个库 not found

解决这个问题有几个方法:
(1) 修改/etc/ld.so.conf文件,这个文件是系统查找库文件的配置文件,将我们的库所在的目录添加进去之后,运行时便可找到动态链接库
(2) 由于系统默认会搜索/usr/lib和/lib目录下的库,所以将生成的库直接放在这两个目录其一亦可。
以上两种方法在进行完之后都需运行ldconfig,更新运行的库
(3) 运行时直接使用 LD_LIBRARY_PATH 命令指定动态链接库路径

LD_LIBRARY_PATH=/home/c++/ ./a.out
# LD_LIBRARY_PATH 等号之后就是库路径

猜你喜欢

转载自blog.csdn.net/lianggx6/article/details/87903332