分享

GCC/G++快速使用指南

 cupid 2015-09-15

使用一个例子介绍GCC/G++的编译选项。

准备工作?

以debian6为例,安装必要的软件包。

apt-get install build-essential

另外,在下面的例子中为了展示gcc的-L和-l选项,使用了mysql库,因此需要安装mysql-dev软件包

apt-get install mysql-dev

例子?

工程涉及4个文件,如下所示,源代码放在这里

common.h  # 定义类型和宏等
util.h    # include common.h
util.cpp  # include util.h `<mysql/mysql.h>`
main.cpp  # include common.h util.h

Makefile?

上面工程的Makefile定义如下。

GCC = /usr/bin/g++
GCC_FLAGS = -c -Wall
LD_FLAGS = -L /usr/lib/mysql -l mysqlclient
TARGET = gcc-quick-start
OBJECTS = util.o main.o

all: $(TARGET)

$(TARGET): $(OBJECTS)
    $(GCC) $(LD_FLAGS) -o $(TARGET) $(OBJECTS)

%.o: %.c
    $(GCC) $(GCC_FLAGS) $<

.PHONY: clean
clean:
    rm -f $(OBJECTS) $(TARGET)

编译为动态/静态链接库?

介绍将二进制文件打包为动态和静态链接库的方法。

动态链接库 shared library?

g++ -shared -o libctest.so -fPIC a.cpp b.cpp

静态链接库 static library?

g++ -c a.cpp b.cpp
ar -rvs libtest.a a.o b.o

注意事项?

链接顺序?

被依赖的库应当放在依赖它的库的后面,如A依赖于B,则B应置于A后。

g++ ... A B

强制使用静态/动态库?

使用-Wl选项可以设置使用静态或动态库,可参考这篇文章

g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

上面的命令将zlib和libfoo链接为静态库,将libbar链接为动态库。 -Wl选项将后面的用逗号隔开的参数列表传给链接器ld。

阅读资料?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多