威尼斯人线上娱乐

转发及个体观点,配置本身的OpenGL库

7 4月 , 2019  

错误“AxImp.exe”已退出,代码为,aximp.exe代码

http://blog.csdn.net/duguduchong/article/details/17166123

方今选用vs20十  在重复生成消除方案的时候出现 “AxImp.exe”已脱离,代码为
-11630一95九叁。出现那种场地

点击  项目——属性

威尼斯人线上娱乐 1

 

转发及个体观点,配置本身的OpenGL库。选料叁.5后转移一下,然后换回四.0  就能够了。(release 对应release
的三.5,debug对应debug的3.5)

 

本身用的是VS201伍,在编好代码后,先点击“清理”,再点击“生成”,就涌出了图示的一无所长【“错误“AxImp.exe”已脱离,代码为
-11630一九陆零3。”】,在品尝了上海教室方法后并不见效,

提起底把原来工程Debug下的文书全体正片过来,替换原有文件,添加引用,发现有3个引用出现惊叹号报警,删除后方可不奇怪使用,以上是本人的调剂进度,也许会有尾巴,仅供我们参考。

近来采纳vs20十在再一次生成化解方案的时候现身…

 

近些年利用vs2010  在再一次生成化解方案的时候出现 “AxImp.exe”已退出,代码为
-11630一9伍陆叁。出现那种景色

新近选拔vs2010  在重复生成消除方案的时候出现 “AxImp.exe”已脱离,代码为
-11630一九伍73。出现那种场所

平台:Windows7,Visual C++ 2010

点击  项目——属性

点击  项目——属性

 

威尼斯人线上娱乐 2

威尼斯人线上娱乐 3

1. 引言

 

 

   
实验室的二个种类,用到OpenGL举行实时绘制,还用到有的别样的库,八个干扰自个儿很久的难点正是编写翻译时遇到的种种符号未定义,符号重定义之类的链接错误,其貌似格局如下:

选料3.伍后变更一下,然后换回四.0  就可以了。(release 对应release
的三.5,debug对应debug的3.伍)

慎选三.伍后变更一下,然后换回四.0  就足以了。(release 对应release
的叁.五,debug对应debug的三.五)

xxx.obj : error LNK201九:
无法解析的表面符号__xx_xxx@xx,该符号在函数 _xxx 中被引用

 

 

MSVCRTD.lib(ti_inst.obj) : error LNK2005:
“private: class type_info & __thiscall type_info::operator=(class
type_info const &)” (??4type_info@@AAEAAV0@ABV0@@Z) 已经在
LIBCMTD.lib(typinfo.obj) 中定义

本身用的是VS20一5,在编好代码后,先点击“清理”,再点击“生成”,就应运而生了图示的错误【“错误“AxImp.exe”已退出,代码为
-1163019603。”】,在尝试了上海体育场合方法后并不奏效,

小编用的是VS20壹五,在编好代码后,先点击“清理”,再点击“生成”,就涌出了图示的失实【“错误“AxImp.exe”已退出,代码为
-1163019603。”】,在尝试了上海体育场地方法后并不奏效,

 
  一言以蔽之,这种题材壹般是贫乏库(library,或库的本子不对)或八个库引用的C奥迪Q7T(C
run-time
library,C语言运营库)不平等导致的。本文对那壹标题做不难研究,并用glew、freeglut库的安排作为例子。

聊起底把原来工程Debug下的文本全部拷贝过来,替换原有文件,添加引用,发现有3个引用现身惊讶号报告警察方,删除后方可健康使用,以上是自家的调节和测试进程,可能会有漏洞,仅供我们参考。

最后把原先工程Debug下的文件全体拷贝过来,替换原有文件,添加引用,发现有三个引用出现惊叹号报告警察方,删除后方可健康使用,以上是本身的调剂进程,恐怕会有漏洞,仅供我们参考。

 

2. 静态链接库、动态链接库、C奇骏T、STL

 
  大家要到一个函数,要么是供给该函数的源代码,要么是清楚该函数的注解并有该函数的落到实处,这里的“达成”又分为静态链接库、动态链接库。在windows平台上,静态链接库对应以.lib为后缀的库文件,动态链接库对应.dll为后缀的动态链接库文件。关于静态链接库、动态链接库请参见wikipedia相应条款:

 
  大家用VC++写的先后暗中认可编写翻译为可执行文件(.exe),即使想昭示温馨的库,能够在VS的“类型性质 >> 配置属性 >> 常规
>>
配置项目
”修改。这样一旦之后想用这一个函数就不须要引入对应.cpp文件,而只需包罗带有该函数宣称的头文件,并引用库文件即可——对于静态链接库,可以用“#pragma
comment (lib, “xxx.lib”)”指令,或在VS的“品类性质 >> 配置属性 >> 链接器
>> 输入 >>
附加正视
”中丰硕;对于动态链接库,可以用“__declspec(dllimport)”注脚要用的函数,假如为.dll文件落到实处了导入库(对应的.lib文件,里面实现了函数导入,使用同静态链接库),则动态库的应用同静态库,只是程序执行时供给.dll文件。msdn上有静态库和动态库的利用教程:

    简单计算,可执行文件(.exe)和库文件(.lib、.dll)都包涵源代码编写翻译出来的可实施二进制代码。静态链接和动态链接的分别在于:静态链接编写翻译出的可实施代码体量较大,动态链接编写翻译出的可实行代码执行时正视对应的.dll文件。

    C奥迪Q5T(C语言运转库)实现了C语言相关开首化代码以及落到实处了C函数库,C++能够当作C语言的超集,所以C++并没有“CP奥迪Q5T(C++运维库)”,C++也选拔CPAJEROT,标准C++除C索罗德T外还达成了STL(standard
C++ library,C++标准库,注意STL是Standard Template
Library的缩写,因为C++标准库首假若用模板完毕的)。既然函数的“达成”至少有静态和动态之分,那CPRADOT或STL也有四处叁个版本,后文针对VC20拾阳台探讨那些本子。

    计算,CBMWX五T是C语言函数库及早先化代码的兑现,STL是C++标准库的贯彻,所谓“落成”正是由源代码编译出来的.lib、.dll文件等。

 

3. VS的编写翻译选项

    在VC2010上,CCRUISERT和STL至少分为静态和动态,静态和动态中又各自有Debug和Release版本(早期VC还有单线程和十2线程之分,近来VC++中只提供四线程版本),那样CKugaT和STL都有起码多个本子。现在来诠释引言中的符号未定义、符号重定义链接错误的可能场景,程序A中调用了函数f,函数f是在程序B中编辑的,为了使用f,将次第B编写翻译为库(而非.exe)——静态库:B.lib\动态库:B.lib、B.dll,程序A为了使用f,包涵头文件B.h(个中有函数f的宣示)并引用B.lib:

1 #include"B.h"
2 #pragma comment (lib, "B.lib")

    假使未有上面的第一句代码,则产出了标记未定义的链接错误:

main.obj : error LNK201九:
无法解析的外表符号 _f@0,该符号在函数 _main 中被引用

    上边错误消息中的“_f@0”具体取决于函数调用约定的命超方式(_cdecl、_stdcall等)。

    若是编写翻译程序B时利用了动态版本的C奥迪Q5T而编写翻译A时选择的是静态版本CTiguanT(即A、B使用了差别版本的C奥迪Q3T),则产出了标记重定义之类的链接错误(不绝对)。

    当然若是用动态链接版本的B,程序A运营时可执行文件搜索路径中务必带有B.dll,不然报告“丢失xxx.dll”之类的荒唐。

    设置程序到底使用哪个版本的C卡宴T可在VS的“品类性质 >> 配置属性 >>
C/C++ >>
代码生成 >>
运行库”中装置,未来将二种设置相应的库文件,编写翻译器的宏定义列在下表:

Option

Preprocessor directives

C run-time library (without iostream or standard C++ library)

Standard C++ Library

/MT

_MT

libcmt.lib

LIBCPMT.LIB

/MD

_MT, _DLL

msvcrt.lib (import library for MSVCR100.DLL)

MSVCPRT.LIB (import library for MSVCP100.dll)

/MTd

_DEBUG, _MT

libcmtd.lib

LIBCPMTD.LIB

/MDd

_DEBUG, _MT, _DLL

msvcrtd.lib (import library for MSVCR100D.DLL)

MSVCPRTD.LIB (import library for MSVCP100D.DLL)

    个中,MT为是multi-thread的缩写,上边说了,全数这几个库都以拾2线程的,大写D代表DLL,小写d代表debug,如/MDd下引用动态链接调节和测试版本的库,并且编译器定义宏_DEBUG,
_MT,
_DLL(程序中能够用#ifdef指令来判定库版本),引用的CWranglerT达成文件为MSVCPKoleosTD.LIB,该公文只是导入库并从未现实的履行2进制代码,程序运维时动态链接MSVCP100D.DLL文件,STL达成公文同理。

   
文件名“MSVC[R,P]100[D]”中的“100”对应VC20十,VC200三、VC200伍、VC二零一零、VC2010、VC二〇一三分别为71、80、90、十0、110,有个别时候大家运转1个主次提示“丢失msvcrxxx.dll”,能够因此设置对应VS来化解,假若不想安装VS,也可经过设置“Microsoft
Visual C++ 20xx [SP1] Redistributable
Package”来解决。

    可参考msdn的C run-time libraries条目:

 

4. 编译glew

威尼斯人线上娱乐,    可到以下地点下载最新glew:

    解压后打开…\glew-1.10.0\build\vc10\glew.sln文件,能够观察有“glew_shared”和“glew_static”多个档次,从右键属性中得以看到它们分别生成动态和静态的库:

威尼斯人线上娱乐 4

威尼斯人线上娱乐 5

    还足以观察debug和release配置下各自采纳相应debug和release版本CTiguanT:

威尼斯人线上娱乐 6

威尼斯人线上娱乐 7

    博文写到那里,发现多个难点,“glew_static”应该运用静态版本的C哈弗T,但从上海教室看到,release下是静态链接(/MT),但debug下怎么不是“/MTd”呢?(后边会更为分析)

    在使用glew是亟需包括相应头文件,并链接相应库文件,将方面生成的八个本子的库文件拷贝出来:

威尼斯人线上娱乐 8

    其汉语件名中的s代表static,即静态链接,d代表debug,即调节和测试版本,不带s的是动态链接版本,不带d的是release版本,文件名可以从glew工程的配备“体系性质 >> 常规 >>
指标文件名
”中看到:

威尼斯人线上娱乐 9

    然后将…\glew-1.10.0\include\GL\上边文件拷贝出来:

威尼斯人线上娱乐 10

    将头文件所在路径添加到到VC2010类别涵盖目录中,有三种办法:“品种性质 >> 配置属性 >> VC++目录
>> 包罗目录
”或“类型性质
>> 配置属性 >> C/C++ >> 常规 >>
附加包罗目录
”,将库文件所在路径添加到到VC2010项目库目录中,也有二种艺术:“品种性质 >> 配置属性 >> VC++目录
>> 库目录
”或“品种性质
>> 配置属性 >> 链接器 >> 常规 >>
附加库目录
”。

    通过判断C奥迪Q5T版本来引用不一样库(那样幸免C揽胜T版本不均等):

 1 #ifdef _DLL // dynamic link
 2   #ifdef _DEBUG
 3     #pragma comment (lib, "glew32d.lib")
 4     #pragma comment (lib, "freeglutd.lib")
 5   #else
 6     #pragma comment (lib, "glew32.lib")
 7     #pragma comment (lib, "freeglut.lib")
 8   #endif
 9 #else // static link
10   #ifdef _DEBUG
11     #pragma comment (lib, "glew32sd.lib")
12     #pragma comment (lib, "freeglutsd.lib")
13   #else
14     #pragma comment (lib, "glew32s.lib")
15     #pragma comment (lib, "freegluts.lib")
16   #endif
17   #define GLEW_STATIC
18   #define FREEGLUT_STATIC
19 #endif
20 #include "GL/glew.h"
21 #include "GL/freeglut.h"

    上述代码应用编写翻译器在不相同配置(/MT、/MD、/MTd、/MDd)下放置的不等宏来判断使用的C奥德赛T版本,并引述对应版本glew和freeglut库版本。

    那样布置后编写翻译自个儿的次序不会再冒出引言中的链接错误了,但有很多之类警告:

glew32s.lib(glew.obj) : warning LNK4099:
未找到
PDB“vc100.pdb”(使用“glew32s.lib(glew.obj)”或在“C:\Users\hll\Desktop\fluid
2014.01\Release\vc100.pdb”中摸索);正在链接对象,就像未有调试消息1样

    将glew工程配置成不扭转调节和测试音信,或把调节和测试新闻直接扭转到.obj文件中(而非.pdb文件)即可,“品类性质 >> 配置属性 >> C/C++
>> 常规 >>
调节和测试音信格式
”,空表示不转变调节和测试新闻,C7把调节和测试音信直接生成到.obj文件中,私下认可的Zi生成.pdb文件:

威尼斯人线上娱乐 11

    接着上边说起的“glew_static”的铺排难点(往上找那段绿色的话),在祥和工程布署为“/MTd”时引用glew3二sd.lib库程序报错如下:

一>—— 已开发银行转移: 项目: exampleGL,
配置: Debug_static Win32 ——
1>生成运行时间为 二〇一五/1/15
17:4二:55。
1>InitializeBuildStatus:
1>
正在对“Debug_static\exampleGL.unsuccessfulbuild”执行 Touch
任务。
1>ClCompile:
壹> 全体出口均为新型。
1>ManifestResourceCompile:
一> 所有出口均为流行。
1>MSVCRTD.lib(ti_inst.obj) : error
LNK2005: “private: __thiscall type_info::type_info(class type_info
const &)” (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMTD.lib(typinfo.obj)
中定义
1>MSVCRTD.lib(ti_inst.obj) : error
LNK2005: “private: class type_info & __thiscall
type_info::operator=(class type_info const &)”
(??4type_info@@AAEAAV0@ABV0@@Z) 已经在 LIBCMTD.lib(typinfo.obj)
中定义
一>LINK : warning LNK4098:
私下认可库“MSVC宝马X3TD”与其余库的接纳争持;请使用 /NODEFAULTLIB:library
1>C:\Users\hll\Desktop\exampleGL\Debug_static\exampleGL.exe
: fatal error LNK116九: 找到四个或四个多重定义的符号
1>
一>生成战败。
1>
一>已用时间 00:00:00.3八
========== 生成: 成功 0 个,失败 1
个,最新 0 个,跳过 0 个 ==========

    利用方面VC20拾编写翻译配置表(往上找加粗的表),配置为“/MTd”使用的是库libcmtd.lib,而msvcrtd.lib是“/MDd”配置下选择的库,解决上述符号重定义错误的多个主意如下:

#pragma comment (linker, "/NODEFAULTLIB:MSVCRTD.lib")

    但很鲜明,那不是美貌的解决方法,尽管大家“私行”将“glew_static”的上述配置“/MDd”改为“/MTd”
(依旧往上找那段绿色的话),这几个难点也会烟消云散,看来那可能是glew发表版(一.10.0)的二个bug(除了刚分析的“glew_static”
debug的计划“/MDd”改为“/MTd”,还有一处,“glew_shared”
release的配备“/MT”改为“/MD”),但那恰好成就了大家对本文技术分析结果的一应俱全应用~

 

5. 编译freeglut

    可到以下地点下载最新freeglut:

    有了glew编写翻译经验,以及和谐的工程计划经验之后,freeglut的编写翻译那里就差不多些说了。

    解压后打开…\freeglut-2.8.1\VisualStudio\2010\freeglut.sln文件,能够看来它的铺排略有差异:

威尼斯人线上娱乐 12

    再任由打开贰个C奥迪Q7T配置能够观察:

威尼斯人线上娱乐 13

    freeglut并未像glew那样在C奥德赛T配置上冒出小bug(还是往上找那段绿色的话)。

    好了,像glew壹样,用配备管理器的四个选项(debug、release、debug_static、release_static,分别对应5个CKoleosT版本)分别编写翻译出陆个本子的库(四个文件,四个.lib,二个.dll),但freeglut并不曾像glew那样将多个本子的文书分别命名用或不用s及d结尾,它的debug版和release版文件名相同,笔者不得不自身改呀(那1改带来许多标题):

威尼斯人线上娱乐 14

    改为:

威尼斯人线上娱乐 15

    别的类推,并将freeglut_std.h文件中如下代码:

...
#    pragma comment (lib, "freeglut_static.lib")
...
#      pragma comment (lib, "freeglut.lib")
...

    修改为:

...
#    ifdef _DEBUG
#      pragma comment (lib, "freeglutsd.lib")
#    else
#      pragma comment (lib, "freegluts.lib")
#    endif
...
#      ifdef _DEBUG
#        pragma comment (lib, "freeglutd.lib")
#      else
#        pragma comment (lib, "freeglut.lib")
#      endif
...

    修改依照相同,还是基于C大切诺基T的七个本子引用多少个本子的.lib文件。注意,笔者事先在freeglut项目中只做了“目的文件名”的修改,而未做.h文件的上述修改来编写翻译freeglut(只是将.h文件拷贝出来后才修改,那样本人项目包罗的是修改后的freeglut_std.h文件,而编写翻译freeglut用的是原版),那样的结果是,生成出来的.lib文件之中仍在引用”freeglut_static.lib”(而不是”freegluts.lib”),用二进制打开生成的.lib文件如下:

威尼斯人线上娱乐 16

    而利用修改后的freeglut_std.h文件编写翻译freeglut结果如下:

威尼斯人线上娱乐 17

    使用未修改的freeglut_std.h文件生成”freegluts.lib”
后,本人工程分包修改后的freeglut_std.h,按说只援引”freegluts.lib”,但链接器仍报告找不到”freeglut_static.lib”文件。

    其它1个类似的题材是,当编写翻译动态链接debug版本的库时,生成文书为freeglutd.dll和freeglutd.lib(名字规则:非静态不带s,debug带d),头文件中引用”freeglutd.lib”将freeglutd.dll拷贝到VC20十自动生成的debug文件夹下(和融洽工程变更的.exe文件一律文件夹),运营程序结果告知“丢失freeglut.dll”(不带自身本身修改后的名字的d),编写翻译freeglut生成的.lib和.dll文件名称叫freeglutd,但.lib文件之中引用的.dll文件名叫freeglut(不带d),验证如下:

威尼斯人线上娱乐 18

    经过一番讨论,
freeglut的安插下,freeglutd.lib文件是链接器依照二个.def文件生成的(glew的导入库配置在“项目性质 >> 配置属性 >> 链接器
>> 高级 >> 导入库
”):

威尼斯人线上娱乐 19

    .def文件内容如下:

威尼斯人线上娱乐 20

    经查,第三行“LIBRAENVISIONY
freeglut”的含义就是“引用freeglut.dll”,将该句去掉,链接器生成的.lib文件引用的.dll文件自动和转变的.dll文件同名,难点消除:

威尼斯人线上娱乐 21

   
其余值得一提的是当生成动态链接版本的.dll文件时,用到了三个财富文件,其剧情如下(glew中的):

威尼斯人线上娱乐 22

 

6. 搭建OpenGL工程

    工程标准:将glew和freeglut库放在工程文件夹下以免止对环境信赖、不可能出现任何关于库争辨等警告(错误当然更不得以)、依照CRAV4T的五个版本定义多少个布局(debug,release,debug_static,release_static)。

    将地点的glew和freeglut的编译总括在上面:

glew—

1.bug修复,“glew_static” debug的配置“/MDd”改为“/MTd”,“glew_shared”
release的配置“/MT”改为“/MD”

2.不转变调节和测试新闻,“glew_static”和“glew_shared”全部配置下的“调节和测试音讯格式”改为空

3.对“glew_static” debug及release 和 “glew_shared”
debug及release分别编写翻译,获得glew3二sd.lib、glew3二s.lib、glew3贰d.lib(glew32d.dll)、glew32.lib(glew3二.dll)

freeglut—

一.生成靶子文件名修改,“freeglut”的“目的文件名”项原来为$(ProjectName)和$(ProjectName)_static,4个配置debug、release、debug_static、release_static分别改为$(ProjectName)d、$(ProjectName)、$(ProjectName)sd、$(ProjectName)s

2.不转移调节和测试音信,“freeglut”所有配置下的“调试消息格式”改为空

3.freeglut_std.h文件修改如上述

肆.freeglutdll.def文本删去第二行的“LIBRATucsonY freeglut”

5.对“freeglut”的4个配置debug、release、debug_static、release_static分别编写翻译,获得freeglutsd.lib、freegluts.lib、freeglutd.lib(freeglutd.dll)、freeglut.lib(freeglut.dll)

    如下构造文件夹tool:

tool
  freeglut-2.8.1
    bin
      freeglut.dll, freeglutd.dll
    inc
      GL
        freeglut.h, freeglut_ext.h, freeglut_std.h, glut.h
    lib
      freeglut.lib, freeglutd.lib, freegluts.lib, freeglutsd.lib
  glew-1.10.0
    bin
      glew32.dll, glew32d.dll
    inc
      GL
        glew.h, glxew.h, wglew.h
    lib
      glew32.lib, glew32d.lib, glew32s.lib, glew32sd.lib

    如下构造VC2010工程:

新建VS
C++控制台项目,将上边tool文件夹拷贝到消除方案文件夹下

开辟配置管理器,添加Debug_static(从Debug复制)和Release_static(从Release复制)配置

将Debug、Debug_static、Release、Release_static的“运行库”分别安顿为:/MDd、/MTd、/MD、/MT

在VS“类型性质 >> 配置属性 >> VC++目录
>> 包涵目录
持有配置下添加如下项

$(SolutionDir)tool\glew-1.10.0\inc
$(SolutionDir)tool\freeglut-2.8.1\inc

在VS“项目性质 >> 配置属性 >> VC++目录
>> 库目录
拥有配置下添加如下项

$(SolutionDir)tool\glew-1.10.0\lib
$(SolutionDir)tool\freeglut-2.8.1\lib

增进文书gl_inc.h如下:

威尼斯人线上娱乐 23

添加main.cpp如下:

威尼斯人线上娱乐 24

 

    程序运维结果截图:

威尼斯人线上娱乐 25

 

    怀想到有益本文的读者做尝试,现将搭建的OpenGL工程exampleGL贡献出来(庸俗的代码水准让我们见笑了):

 链接: 密码: jiky

 

7. 总结

   
在VC++上,C奥德赛T和STL有多少个版本,分别对应编写翻译选项:/MDd、/MTd、/MD、/MT;

   
依据编写翻译选项的两样,开源程序编写翻译出的库也分为多少个版本(一般较完美的是伍个,未有五个的能够手动添加配置),那么些本子链接差异的C讴歌MDXT;

   
应基于本身程序的编写翻译选项(用编写翻译器预置宏来判断)链接对应的开源库,不然很有极大或然出现标志未定义、符号重定义的链接错误。

  


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图