美文网首页C/C++
C++编译问题及解决

C++编译问题及解决

作者: 一木之夏 | 来源:发表于2017-09-21 09:21 被阅读14次

    首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

    编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

    链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows下这种包叫“库文件”(Library

    File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

    总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object

    File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker

    Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的ObjectFile.

    1 将main.c预处理汇编编译链接形成可执行文件。

    gcc main.c -o main.o

    选项: -c

    只激活预处理,编译,和汇编,也就是他只把程序做成obj文件

    例子用法:

    gcc -c hello.c

    他将生成.o的obj文件。与gcc -c hello.c -o hello.o效果相同

    2 编译成so库

    g++ src.cpp -fPIC -shared -o libsrc.so

    同时编译多个cpp文件如:

    g++ *.cpp -shared -fPIC -o libSip.so

    3 忽略-Wwrite-strings告警

    遇到该类告警想忽略时增加:-Wno-write-strings

    即:g++ *.cpp -shared -fpic -Wno-write-strings -o sip.so

    4.出现undefined reference to错误时,如截图,

    undefined reference to `dlopen'

    undefined reference to `dlerror'

    undefined reference to `dlsym'

    1.dlopen函数时引用自#include <dlfcn.h>中的,是C的库文件,因此c++调用这些定义的函数时,需要加上extern "C"。用来告知编译器:这是一个用C写成的库文件,请用C的方式连接他们。

    2.如果不加extern "C",在编译的时候需要加 -ldl参数。(Link "dl" library)

    如:g++ testSip.cpp -ldl -o test.o

    编译过程:

    gcc/g++在执行编译工作的时候,总共需要4步

    1.预处理,生成.i的文件

    预处理器cpp

    2.将预处理后的文件不转换成汇编语言,生成文件.s

    编译器egcs

    3.有汇编变为目标代码(机器代码)生成.o的文件

    汇编器as

    4.连接目标代码,生成可执行程序

    连接器ld


    首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)。

    相关文章

      网友评论

        本文标题:C++编译问题及解决

        本文链接:https://www.haomeiwen.com/subject/eyxzsxtx.html