首页 > 编程知识 正文

如何编译so文件,cmd编译cpp文件

时间:2023-05-04 14:51:56 阅读:178027 作者:1125

文章目录gcc如何编译cpp文件? gcc编译c程序的多个源文件以生成可执行文件,生成对象文件以编译预处理并生成汇编代码以创建静态库

gcc如何编译cpp文件/* hello.c */# includeiostreamusingnamespacestd; int main () { cout 'hello cpp'endl; 返回1; }

gcc A.cpp我什么也找不到他

那么,我试着链接到标准c库

gcc A.cpp -lstdc

这样就成功了

gcc是c程序hello world.CPP # includeiostreamintmain (int argc,char * argv [ ] ) (STD :3360 cout ' hello,world ' STD 33603333330 } g helloworld.cpp编译器g检查在命令行中指定的文件扩展名,为c文件编译器的缺省行为编译源代码,并在object file链接文件和libstdc库中删除对象文件

如果将ggcc的缺省语言设置为c的特殊版本并将其链接,则可以自动使用c标准库而不是c标准库遵循源代码命名约定,并指定相应库的名称以使用gcc编译链接c程序。 gcc hello world.CPP-lst DC-ohelloworld-l (ell )通过添加前缀lib和后缀. a将其名称转换为库的名称,然后在标准库路径中搜索库。 gcc的编译过程和输出文件与g完全相同。

在大多数系统上,安装GCC时会安装名为c的程序。 如果已安装,则等效于g,c helloworld.cpp -o helloworld多个源文件生成可执行文件将由g命令指定的多个源文件编译并链接到单个可执行文件speak.h中的头文件# includeiostreamclassspeak { public : void say hello (const char * ); (;/* speak.CPP */# include ' speak.h ' void speak :3360 say hello (const char * str ) STD 3360: cout ' hello ' str/Speak.SayHello('world ' ); 返回(0; }编译上述两个源文件并将其链接到一个可执行文件中。 ghellospeak.CPP speak.CPP-ohellospeak不知道为什么命令中“speak.h”文件包含在“speak.CPP”中,# include ' speak.h“ 从源文件生成-c编译对象文件,但不链接。 输出结果是,对象文件的默认名称与源名称相同,其后缀为. o。 通过编译hellospeak.cpp并生成hellospeak.o g -c hellospeak.cpp g,也可以识别. o文件并将其作为输入文件传递给链接器。 将源文件编译为对象文件,并将其链接到一个可执行文件。 g-chello speak.cppg-cs peak.cppghellospeak.o speak.o-ohellospeak-o只能用于命名可执行文件。 也命名编译器输出的其他文件。 例如,以下命令生成与上述完全相同的可执行文件,但中间对象文件具有不同的名称:

$ g -c hellospeak.cpp -o hspk1.o

$ g -c speak.cpp -o hspk2.o

$ g hspk1.o hspk2.o -o hellospeak编译预处理-E使g在由编译预处理程序处理源代码后不再执行其他处理。 g-ehelloworld.CPP hello world.CPP的源代码只有六行,而且该程序除了显示一行字符外什么都不做。 预处理后的版本超过1200行。 因为包含头文件iostream,还包含其他头文件,所以还有其他一些类定义用于处理输入和输出。 预处理文件的GCC后缀为. ii,可以使用-o选项生成。 $ gcc-ehelloworld.CPP-ohelloworld.ii生成程序集代码-S指示编译器编写程序

译成汇编语言,输出汇编语言代码而后结束 g++ -S helloworld.cpp 生成的汇编语言依赖于编译器的目标平台。 创建静态库 静态库是编译器生成的一系列对象文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。库中的成员包括普通函数,类定义,类的对象实例等等。静态库的另一个名字叫归档文件(archive), 管理这种归档文件的工具叫 ar 先创建两个对象模块,然后用其生成静态库。 /* say.h */ #include <iostream> void sayhello(void); class Say { private: char *string; public: Say(char *str) { string = str; } void sayThis(const char *str) { std::cout << str << " from a static libraryn"; } void sayString(void); }; say.cpp要加入到静态库中的两个对象文件之一的源码。它包含 Say 类中 sayString() 函数的定义体;类 Say 的一个实例 librarysay 的声明也包含在内: /* say.cpp */ #include "say.h" void Say::sayString() { std::cout << string << "n"; } Say librarysay("Library instance of Say"); sayhello.cpp 是我们要加入到静态库中的第二个对象文件的源码。它包含函数 sayhello() 的定义: /* sayhello.cpp */ #include "say.h" void sayhello() { std::cout << "hello from a static libraryn"; } 将源码文件编译成对象文件,命令 ar 将其存进库中: g++ -c sayhello.cppg++ -c say.cppar -r libsay.a sayhello.o say.o ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入。如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。

saymain.cpp,它调用库 libsay.a 中的代码: /* saymain.cpp */ #include "say.h" int main(int argc,char *argv[]) { extern Say librarysay; Say localsay = Say("Local instance of Say"); sayhello(); librarysay.sayThis("howdy"); librarysay.sayString(); localsay.sayString(); return(0); } 该程序可以下面的命令来编译和链接: g++ saymain.cpp libsay.a -o saymain 程序运行时,产生以下输出:
hello from a static library
howdy from a static library
Library instance of SayLocal instance of Say

添加链接描述

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。