A. c++ 编译 链接是怎么回事
compile和link是大多数语言从原代码生成可执行程序的两个步骤。
之所有有这两个步骤因为几乎任何一个程序都不是用一个原文件写出来的。compile是先针对单独原文件进行处理。link是把compile处理的结果组合成一个完整的可执行文件。
其实C/C++完全也可以一步成型,不需要compile和link两个步骤,但是那样的后果就是:一,每次生成可执行程序,必须翻译全部源代码;二,C语言的执行库(printf, scanf这些)必须都以源代码形式存在。这怎么样也说不过去吧。
另外头文件不属于compile和link过程,头文件是预编译过程的文件。
C/C++语言的完整编译过程是
一、预编译
处理#define #if #include这类#开头的语句,这些称为预编译指令。这个过程中会把.h文件和.c/.cpp文件组合成最终交给compile过程的原文件。这个原文件是不包含任何#开头的语句的。所有#define定义的宏也会被替换。
二、编译
把上面那个原文件编译成.o或者VC里是.obj文件。这个文件保存了机器码化的函数、函数的描述、全局变量的描述、乃至段的描述等等。
三、连接
把可执行程序需要的所有的编译过程产生的.o或者.obj文件组合到一起。(这里也包括.lib文件,.lib文件件本质上就是打包的.obj文件集合)。另外连接过程还会组合一些其他数据,比如资源、可执行文件头等等。
B. 命令行编译链接,出现LNK2019错误,怎样解决
在visual studio环境下编译链接通过,但我在命令行模式下连接出现如下错误: /out:test01.exetest01.objtest01.obj : error LNK2019: 无法解析的外部符号 __imp__MessageBoxA@16 ,该符号在 函数 _MessageBoxPrintf 中被引用 test01.obj : error LNK2019: 无法解析的外部符号 __imp__GetSystemMetrics@4 ,该符 号在函数 _WinMain@16 中被引用 test01.exe : fatal error LNK1120: 2 个无法解析的外部命令 下述是我在msdn查到的相关资料: 无法解析的外部符号symbol,该符号在函数function中被引用 在 function 中找到了未定义的外部符号 (symbol)。若要解决此错误,请提供符号定义或移除引用它的代码。 请看下面的示例: extern int i; extern void g();void f(){i++;g();}int main(){}如果在生成中包含的某个文件中没有定义 i 和 g,链接器将生成 LNK2019。可以添加这些定义,方法是将包含这些定义的源代码文件包括为编译的一部分。或者可以将包含这些定义的 .obj 或 .lib 文件传递给链接器。 对于从早期版本升级到当前版本的 C++ 项目,如果定义了 __UNICODE 并且入口点为 WinMain,需要将入口点函数的名称更改为 _tWinMain 或 _tmain。 导致 LNK2019 的常见问题有: 符号声明包含拼写错误,以致于符号声明与符号笑塌定义不同。 使用了一个函数,但其参数的类型或数量与函数定义不匹配。 函数声明使用和函数定义使用中的调用约定(__cdecl、__stdcall 或__fastcall)不同。 符号定义在编译为 C 程序的文件中,而符号是在 C++ 文件中不带 extern C 修饰符声明的。在此情况下,请修改声明,例如不是使用: extern int i; extern void g();而使尺升肢用: extern C int i; extern C void g(); 同样,如果在将由 C 程序使用的 C++ 文件中定义符号,请在定义中使用 extern C。 符号定义为静态,但稍后在文件外部被引用。 没有定义静态类成员。例如,应单独定义下面类声明中的成员变量 si: #include <stdio.h struct X {static int si;}; // int X::si = 0; // uncomment this line to resolve printf(/n%d,px[0].si); // LNK2019}/verbose 链接器选项帮助您查看链接器引用的文件。DUMPBIN 实陵世用工具的 /EXPORT 和 /SYMBOLS 选项还可以帮助您查看 dll 和对象/库文件中定义的符号。
C. 编译、链接和交叉链接的区别与联系
1、链接是将目标代码与其他对象文件(例如库文件)合并成单个可执行文件的过程。在链接纳运过程中,符号解析和地址重差茄旦定向等操作被执行。
2、虚扰交叉链接是指将不同的目标文件和库文件进行链接,以生成适用于特定平台或操作系统的可执行文件。它通常用于开发跨平台应用程序。
D. 在附加依赖项里面已经添加了相应的lib文件,为什么编译链接的时候还是提示无法解析的外部符号
我在vs2008环境下面遇到了这个问题
总算自己逗举解决了
如果选择的是win32而非x64配置,对应的库目录一定要设置到x86而非x64
在win32配置下使如指答用x64 directx 库就会出现这种情况
解决方法:
假设directx目录为 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\
则对于win32配置
项目->属性->C/C++->常规->附加包含目录 添加 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Include
项目->属性->链接器->常规->附加库目录 添加 C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x86
然后选择全部重渣慧新编译
我就是这样解决了这个问题
E. 计算机上程序编译运行分别是什么符号
意思和区别如下:
1、编译:依赖于编译器,英文是compile, vc中这一过程是将源代码转换成目标文件,如.obj文件,.rc文前旦件等。
2、生成:指的是链接的过程,英文是build.依赖于链接器. vc中在这一阶段将所有的目标文件和所有需要用到的组件组合成一个整体,例如需要生成蠢蚂的是windows系统下的PE可执行文件,链接器会依照特定格式慧档扰将目标文件组合,最后生成PE格式的.exe或.dll文件。
3、调试:是所有或部分代码编写完成后,让程序在调试器中运行,用这种手段对程序进行分析,找出并修正潜在问题。
4、运行:就是让程序在系统中运行。
F. 在C编译环境下出现符号未定义的链接错误
看看是什么符号未定义,可能引用的外部变量或者函数没有定义,这个可能是有.c源文件没有编译进来造成的
G. Linux 下 so 的符号链接机制是为什么
为了升级方便,举个例子来说,有个共享库的文件名字叫作libfoo.so.1,某客户程序使用该库的功能,编写代码后编译成功了。在连接生成二进制文件的客户程序时,正规的做法是建立一个libfoo.so.1文件的链咐符号链接,名字通常会枯唤岁叫做libfoo.so,于是客户程序的连接参数应该写成-lfoo,连接生成二进制文件后我们使用ldd命没睁令可以看到客户程序依赖于libfoo.so.1这个库文件。
此后,libfoo.so的开发者决定升级该库,但是发布文件的时候文件名改成了libfoo.so.2,并且重新生成符号链接文件libfoo.so指向libfoo.so.2这个新版的共享库。这样做的好处是客户程序在重新编译的时候无需更改Makefile文件,仍然使用-lfoo这个连接参数即可。
H. 编译dll时调用其他第三方dll,编译通过但链接时提示无法识别的外部符号
“编译后在Release中输出打包的DLL”这个说法是不对的,或者说,是不行的。如果缓数罩使用了MFC的dll和其它第三方(包括自定义)DLL文件,那么需要发布的时候,就需要制作一个“软件安装包”,这儿软件安装包打包了EXE,dll和你需要的其它数据文件(具体打包什么是由你自己指定的),软件打包工具软件,VisualStudio自带了一个,叫做:InstallShieldforVC6。这个程序使用比较复杂(需要自编代码)也很灵活,简单的安装包制作毕销软件也有,你可以网上搜索一下,很多。另外,如果说,你只需要打包MFC标准DLL,那么,就不是打包的问题了,很简单,在RELEASE编扰闹译模式设置(project菜单)中,选择MFC为静态库,那么编译之后的程序,就不需要拷贝MFC的标准DLL(或者vc环境)支持了。
I. 预编译命令行由什么符号开头
#号是官方定义的,用于和其他类型区别的,不用多考虑,你就看看我给你的链接看看官方的说法
条件编译符号#define ???
#if、#elif、#else 和 #endif 指令提供的条件编译功能是通过预处理表达式和条件编译符号来控制的。
conditional-symbol:(条件符号:)
除 true 和 false 外的任何标识符或关键字
条件编译符号有两种可能的状态:已定义的或未定义的。在源文件词法处理开始时,条件编译符号除非已由外部机制(如命令行编译器选项)显式定义,否则是未定义的。当处理 #define 指令时,在指令中指定的条件编译符号在那个源文件中成为已定义的。此后,该符号就一直保持已定义的状态,直到处理一条关于同一符号的 #undef 指令,或者到达源文件的结尾。这意味着一个源文件中的 #define 和 #undef 指令对同一程序中的其他源文件没有任何影响。
当在预处理表达式中引用时,已定义的条件编译符号具有布尔值 true,未定义的条件编译符号具有布尔值 false。不要求在预处理表达式中引用条件编译符号之前显式声明它们。相反,未声明的符号只是未定义的,因此具有值 false。
条件编译符号的命名空间与 C# 程序中的所有其他命名实体截然不同。只能在 #define 和 #undef 指令以及预处理表达式中引用条件编译符号。
J. 如何在编译动态链接库时报告未定义符号的错误
1可能头文件有问题,2也有可能图形驱档拍动的饥档问题,3可能你安装WINTC的时候没有勾选图形驱动选项烂蠢乱!!!第三种情况是最大的可能!!!!!!