编译和连接:
编译通常是对单个源文件进行编译成.o文件;
要加上-c选项,比如 gcc -o aa.o -c aa.cpp
否则会提示找不到main函数;因为有些模块只是提供单元函数;并没有main函数;
编译只检查基本语法,对于引用的外部函数,只用能找到其声明就可以正确编译通过,比如在cpp文件中包含了引用的外部库函数的头文件等.
连接是指把先前编译出来的.o连接成可执行的文件;这时候ld就要找到所有函数和变量的定义和实现;如果引用了外部库函数就要在连接的时候制定要连接的库.这样ld就可以到相应的库里面找到cpp中用到的函数.
连接还有一种情况就是把几个.o连接成一个so动态库;
这时候ld也不寻找那些引用的外部库函数;只是简单的连接;
比如要把a.o ,b.o 连接成一个libab.so动态库,其中a.o中用了第三方库libthird.so中的函数;在连接时要用选项-G(solaris下面)活着-shared(linux下面)以表明这是在生成一个库,而不是最终目标;这样ld就不会去检查应用的外部函数是否能找到:gcc -G -o libab.so a.o b.o
如果写成:gcc -o libab.so a.o b.o,连接的时候就会认为要生成最终目标libab.so,从而会去找a.o中用到的第三方库;如果找不到就报错.
所以在连接成最终目标的时候要加入连接选项 -lthird
如果一个程序用了上面说的libab.so中的函数,那么在生成最终目标程序时一定要加入这个连接库-lab;而因为libab.so又用到了libthird.so,所以也一定要加入-lthird;否则会提示libab.so中一些符号未定义.