链接器

VS2010运行时库参数设置说明

一笑奈何 提交于 2019-12-04 12:46:45
错误 1 error LNK2005: __cexit 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义 d:\ProjectArchive\LibH264\LibH264\libcmtd.lib(crt0dat.obj) LibH264 错误 2 error LNK2005: __amsg_exit 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义 d:\ProjectArchive\LibH264\LibH264\libcmtd.lib(crt0dat.obj) LibH264 错误 3 error LNK2005: __initterm_e 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义 d:\ProjectArchive\LibH264\LibH264\libcmtd.lib(crt0dat.obj) LibH264 错误 4 error LNK2005: ___CppXcptFilter 已经在 MSVCRTD.lib(MSVCR100D.dll) 中定义 d:\ProjectArchive\LibH264\LibH264\libcmtd.lib(winxfltr.obj) LibH264 错误 5 error LNK2005: __encoded_null 已经在 MSVCRTD.lib(MSVCR100D

适用于Windows桌面应用程序的.NET Core 3

五迷三道 提交于 2019-12-03 22:24:26
介绍 9月,微软发布了新版.NET Core,用于构建Windows桌面应用程序,包括WPF和Windows Forms。从那时起开发人员可以将传统的nfx桌面应用程序(和控件库)迁移到.NET Core。一般使用WPF和Windows Forms开发的业务范围包括: UI密集数据形式(FOD)应用程序 响应式低延迟UI 需要脱机/断开连接运行的应用程序 依赖于自定义设备驱动程序的应用程序 这只是.NET Core上Windows应用程序开发的开始。继续阅读以了解有关.NET Core对构建Windows应用程序更多好处的信息。 为什么在.NET Core上使用Windows desktop? .NET Core(以及将来在.NET Core之上构建的.NET 5)将是.NET的未来。在未来几年内微软将继续支持.NET Framework,但是不会增加任何新功能,这些新功能只会添加到.NET Core(最终是.NET 5)中。为了改进Windows桌面应用领域,并使.NET桌面开发人员可以从中受益,微软将Windows Forms和WPF引入了.NET Core,但因为与Windows API紧密相关,所以仍将仅支持Windows平台。但是.NET Core除了可以跨平台使用外,还具有许多其他功能,可以增强桌面应用程序。 首先,所有运行时改进和语言功能将仅添加到.NET Core中

动态链接学习的一些简单总结

半城伤御伤魂 提交于 2019-12-03 08:08:59
一、源码编写编译 经过几天的学习,对动态链接进行一些简单的摸索,并将学习总结记录如下。 首先编写两个测试源码文件: [ main.c ] 1 #include <stdio.h> 2 3 extern int subVal; 4 void SubFunc(void); 5 int mainVal = 3; 6 7 void MainFunc(void) 8 { 9 10 } 11 12 int main() 13 { 14 puts("In Main."); 15 16 mainVal = 6; 17 subVal = 6; 18 19 MainFunc(); 20 SubFunc(); 21 22 return 0; 23 } [ subFunc.c ] 1 #include <stdio.h> 2 3 static int staticSubVal = 3; 4 int subVal = 3; 5 6 static void StaticTestFunc(void) 7 { 8 9 } 10 11 void TestFunc(void) 12 { 13 14 } 15 16 void SubFunc() 17 { 18 puts("In SubFunc."); 19 20 staticSubVal = 8; 21 subVal = 8; 22 23 StaticTestFunc

C++中的out-of-line虚函数

风格不统一 提交于 2019-12-03 06:51:29
引子 在现实编码过程中,曾经遇到过这样的问题“warning:’Base’ has no out-of-line method definition; its vtable will be emitted in every translation unit”。由于对这个warning感兴趣,于是搜集了相关资料来解释这个warning相关的含义。 C++虚表内部架构 Vague Linkage out-of-line virtual method C++虚表内部架构 在C++实现机制RTTI中,我们大概谈到过C++虚表的组织结构。 但是我们对C++虚表的详细实现细节并没有具体谈及,例如在继承体系下虚表的组织以及在多重继承下虚表的组织方式。 (1)没有继承情况下的类虚表结构 #include <iostream> using namespace std; class Base { public: virtual void Add() { cout << "Base Virtual Add()!"<< "\n"; } virtual void Sub() { cout << "Base Virtual Sub()!" << "\n"; } virtual void Div() { cout << "Base Virtual Div()!" << "\n"; } }; int main()

windows下编译leveldb

匿名 (未验证) 提交于 2019-12-03 00:22:01
一、环境 操作系统:windows x64 编译器:VS2012 https://blog.csdn.net/flyfish1986/article/details/46806893 二、准备下Boost 编译需要Boost库支持,因此先将Boost库编译为64位版本 1.下载好了Boost库,解压boost文件到本地目录(如D:\Program Files\boost_1_58_0\) 2.双击运行目录里的bootstrap.bat,会生成几个可执行文件,包括bjam.exe 3.cmd下切换到boost本地根目录执行下面命令,耐心等待。 https://jingyan.baidu.com/article/dca1fa6f768d76f1a4405289.html 三、导入文件 本文使用的leveldb源码下载地址: https://github.com/google/leveldb/tree/windows 1文件-》新建-》从现有代码文件创建新项目 打开 从现有代码文件创建新项目 向导窗口 2要创建什么类型的项目? 选择Visual C++ 这里源码文件在E:\LIB\leveldb-windows目录中,所以使用的是E:\LIB\leveldb-windows 4项目名称填写 LevelDB 5使用Visual Studio 项目类型选择 静态库(LIB)项目 如果静态库

为什么全局变量一定要初始化?

匿名 (未验证) 提交于 2019-12-02 23:57:01
一、初始化规则部分 在说明为什么要初始化之前,先提及下 C 语言的初始化规则,以备后用。 可能大家在对数组进行初始化时用的是这样的方法: char buf [ 10 ] = { 0 }; 那么 char buf[ 10 ] = { 1 }; 是不是将每个数组中的每个元素都初始化为 1 了呢? 其实不然,根据编译器的特性,在指定初始化元素时,如果元素的个数少于数组元素的总个数,那么其它的元素将会初始化为 0。 我们可以用一段代码来验证这个特性: 1 #include <stdio.h> 2 3 int main () 4 { 5    char buf [ 10 ] = { 1 }; 6 7    return 0 ; 8 } 其反汇编代码如下: 1 <main> : 2   push { fp } ; ( str fp , [ sp , #-4]!) 3   add fp , sp , #0 4    sub sp , sp , #20 5    sub r3 , fp , #16 6   mov r2 , #0 7   str r2 , [ r3 ] 8   str r2 , [ r3 , #4] 9   strh r2 , [ r3 , #8] 10   mov r3 , #1 11   strb r3 , [ fp , #-16] 12   mov r3 , #0 13  

C++编译器和连接器原理

匿名 (未验证) 提交于 2019-12-02 23:57:01
本文转载自新浪永远即等待的博客 几个概念: 1、编译 :编译器对源文件进行编译,就是把源文件中的文本形式存在的源代码翻译成机器语言形式的目标文件的过程,在这个过程中,编译器会进行一系列的语法检查。如果编译通过, 就会把对应的CPP转换成OBJ文件 。 2、编译单元 :根据C++标准,每一个CPP文件就是一个编译单元。 每个编译单元之间是相互独立并且互相不可知 。 3、目标文件 :由编译所生成的文件,以机器码的形式包含了编译单元里所有的代码和数据,还有一些期他信息,如未解决符号表,导出符号表和地址重定向表等。目标文件是以二进制的形式存在的。 根据C++标准, 一个编译单元(Translation Unit)是指一个.cpp文件以及这所include的所有.h文件 ,.h文件里面的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件,后者拥有PE(Portable Executable,即Windows可执行文件)文件格式,并且本身包含的就是二进制代码,但是不一定能执行,因为并不能保证其中一定有main函数。 当编译器将一个工程里的所有.cpp文件以分离的方式编译完毕后,再由链接器进行链接成为一个.exe或.dll文件 。 下面让我们来分析一下编译器的工作过程: 我们跳过语法分析,直接来到目标文件的生成,假设我们有一个A.cpp文件,如下定义: int

【学习总结】gcc和gdb

匿名 (未验证) 提交于 2019-12-02 23:56:01
Ŀ¼ <> vim、gcc、gdb: gcc: gcc和g++是c/c++的linux系统集成的编译器,源文件的后缀应为 .C/.cpp/.c++/.cc等 编译器可以将C、C++等语言源程序、汇编程序编译、链接成可执行程序。 gdb: 是 GNU 开发的一个Unix/Linux下强大的程序调试工具。 gcc 基本格式:gcc [options] file1 file2... //若不加入参数,则按默认参数依次执行编译、汇编和链接操作,生成的可执行文件名为 a.out 常用参数:-E //只执行预处理操作      -S //只执行到编译操作完成,不进行汇编操作,生成的是汇编文件(.s 或 .asm),内容为汇编语言      -c //执行编译和汇编,但不进行链接,即只生成可重定位目标文件(.o),为二进制文件,不生成完整的可执行文件      -o filename //将操作后的内容输出到filename指定的文件中      -static //对于支持动态链接的系统,使用静态链接而不是动态链接进行链接操作      -g          //编译时生成debug有关的程序信息(供gdb使用)      --save-temps //生成编译过程的中间结果文件(包括预处理文件(x.ii)、汇编代码(x.s)、目标文件(x.o)和最终的可执行文件)      -I PATH

gcc -l:手动添加链接库

匿名 (未验证) 提交于 2019-12-02 23:43:01
链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件。在链接过程中,它必须把符号(变量名、函数名等一些列标识符)用对应的数据的内存地址(变量地址、函数地址等)替代,以完成程序中多个模块的外部引用。 而且,链接器也必须将程序中所用到的所有C标准库函数加入其中。对于链接器而言,链接库不过是一个具有许多目标文件的集合,它们在一个文件中以方便处理。 当把程序链接到一个链接库时,只会链接程序所用到的函数的目标文件。在已编译的目标文件之外,如果创建自己的链接库,可以使用 ar 命令。 标准库的大部分函数通常放在文件 libc.a 中(文件名后缀 .a 代表“achieve”,译为“获取”),或者放在用于共享的动态链接文件 libc.so 中(文件名后缀 .so 代表“share object”,译为“共享对象”)。这些链接库一般位于 /lib/ 或 /usr/lib/,或者位于 GCC 默认搜索的其他目录。 当使用 GCC 编译和链接程序时,GCC 默认会链接 libc.a 或者 libc.so,但是对于其他的库(例如非标准库、第三方库等),就需要手动添加。 令人惊讶的是,标准头文件 < math.h > 对应的数学库默认也不会被链接,如果没有手动将它添加进来,就会发生函数未定义错误。 GCC 的 -l 选项可以让我们手动添加链接库。下面我们编写一个数学程序

Win32编程一:Windows应用程序

匿名 (未验证) 提交于 2019-12-02 23:36:01
Windows应用程序的类型   -控制台程序Console     DOS程序,本身没有窗口,通过Windows DOS窗口执行   -窗口程序     拥有自己的窗口,可以与用户交互   -库程序     存放代码、数据的程序,执行文件可以从中取出来代码执行和获取数据     -静态库程序       扩展名LIB,在执行文件执行时从中获取代码     -动态库程序       扩展名DLL,在编译链接程序时,将函数地址放入到执行文件中 三种应用程序的对比   -入口函数     控制台程序-main     窗口程序-WinMain     动态库程序-DllMain     静态库程序-无入口函数   -文件存在方式     控制台程序、窗口程序-EXE文件     动态库程序-DLL文件     静态库程序-LIB文件   -执行方式     控制台-在DOS窗口内执行     窗口程序-拥有自己的窗口中自己的窗口内执行     动态库程序-本身无法执行,由可执行程序或其他的DLL调用     静态库程序-执行不存在,代码会嵌入到可执行文件或DLL中 Windows开发工具和库   -VC的编译工具     编译器CL.EXE 将源代码编译成目标代码(汇编)     链接器LINK.EXE 将目标代码、库链接生成最终文件     资源编译器RC.EXE 将资源编译