vs2019不小心把两个程序弄了一个解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vs2019不小心把两个程序弄了一个解决方案相关的知识,希望对你有一定的参考价值。

参考技术A 想要解决可以根据
1.库的分类

根据链接时期的不同,库又有静态库和动态库之分。

静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。

有别于静态库,动态库的链接是在程序执行的时候被链接的。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用。(TODO:链接动态库时链接阶段到底做了什么)

2 静态库和动态库的比较

链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。

首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。

再者,人非圣贤,即使是精心调试的库,也难免会有错。一旦发现了库中有bug,挽救起来就比较麻烦了。必须一一把链接该库的程序找出来,然后重新编译。

而动态库的出现正弥补了静态库的以上弊端。因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。

那么,是不是静态库就一无是处了呢?

答曰:非也非也。不是有句话么:存在即是合理。静态库既然没有湮没在滔滔的历史长河中,就必然有它的用武之地。想象一下这样的情况:如果你用libpcap库编了一个程序,要给被人运行,而他的系统上没有装pcap库,该怎么解决呢?最简单的办法就是编译该程序时把所有要链接的库都链接它们的静态库,这样,就可以在别人的系统上直接运行该程序了。

所谓有得必有失,正因为动态库在程序运行时被链接,故程序的运行速度和链接静态库的版本相比必然会打折扣。然而瑕不掩瑜,动态库的不足相对于它带来的好处在现今硬件下简直是微不足道的,所以链接程序在链接时一般是优先链接动态库的,除非用-static参数指定链接静态库。

gcc作为编译工具,用在Linux操作系统中,可以编译C、C++、Object-C、JAVA等语言。编译过程中可以带编译选项,选择编译过程。

一、GCC编译流程

1)预处理 Pre-Processing

2)编译 Compiling

3)汇编 Assembling

4)链接 Linking

二、GCC编译选项

1、gcc总体选项列表

1) -c :指编译,不链接,生成目标文件“.o”。

2) -S :只编译,不汇编,生成汇编代码“.S”。

3) -E :只进行预编译/预处理,不做其他处理。

4) -o file:把输出文件输出到file里。

5) -g :在可执行程序中包含标准调试信息。

6) -v :打印出编译器内部编译各过程的命令行信息和编译器的版本。

7) -I dir :在头文件的搜索路径列表中添加dir目录

8) -L dir :在库文件的搜索路径列表中添加dir目录

9) -static :连接静态库(静态库也可以用动态库链接方式链接)

10) -llibrary :连接名为library的库文件(显示指定需要链接的动态库文件)

2、gcc告警和出错选项

1) -ansi :支持符合ANSI标准的C程序

2) -pedantic :允许发出ANSI C标准所列出的全部警告信息

3) -pedantic-error :允许发出ANSI C标准所列出的全部错误信息

4) -w :关闭所有警告

5) -Wall :允许发出gcc提供的所有有用的报警信息

6) -werror :把所有的告警信息转化为错误信息,并在告警发生时终止编译过程

3、gcc优化选项

gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的gcc,

n的取值范围不一致,比较典型的范围为0变化到2或者3。

虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用

的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也可能因为循环展开而变得到处都有。

三、GCC生成动态库和静态库

1)动态库生成

1.单个源文件/目标直接生成动态库

a. gcc -fPIC -shared xxx.c -o libxxx.sob.gcc -fPIC -shared xxx.o -o libxxx.so
2.多个源文件/目标生成动态库

a.gcc -fPIC -shared xxx1.c xxx2.c xxx3.c -o libxxx.so b.gcc -fPIC -shared xxx1.o xxx2.o xxx3.o -o libxxx.so
2)静态库生成

1.单个源文件/目标直接生成静态库

a.ar -rc libxxx.a xxx.o(正确方法)b. ar -rc libxxx.a xxx.c (静态库可以生成;当运行连接了该静态库的可执行程序会报错:could not read symbols:Archive has no index;run ranlib to add one)
2.多个源文件/目标生成静态库

a.ar -rc libxxx.a xxx1.o xxx2.o xxx3.o (正确方法)b.ar -rc libxxx.a xxx1.c xxx2.c xxx3.c (静态库可以生成;当运行连接了该静态库的可执行程序会报错:could not read symbols:Archive has no index;run ranlib to add one)
四、多个源文件生成一个可执行文件

如何用VS2015建立C/C++程序

在远标学过如果你在安装VS2015时选择了默认安装方式,将不具备Visual C++,那么,首先打开软件,然后点击新建项目,选择Visual C++; 出现两个安装选项(),选择其中一个安装; 安装完成重新启动VS,选择新建项目--Visual C++--空项目,单击确定; 右键单击源文件--添加--新建项,选择C++文件(如果需要添加头文件,则选择头文件); 编写一个简单的C程序,完成以后单击生成--生成解决方案,然后单击调试--启动调试 参考技术A 新建项目,里面有c++,.cpp文件,把.cpp改成c就是c程序

以上是关于vs2019不小心把两个程序弄了一个解决方案的主要内容,如果未能解决你的问题,请参考以下文章

怎么把vs2008创建的32位的程序改为64位的?

今天不小心把EUDC.EUF和EUDC.TTE这两个文件删除了,结果造字程序就打不开了~~请问这是怎么回事

我的Eclipse不小心开了两个代码窗口,怎么关掉一个呀

VS2010“解决方案资源管理器”不小心被拖出来如何还原

用vs2019编写c语言程序,明显语法错误为啥不回报错,没有加return 0;

vs2019添加mfc类类视图中不显示