小编use*_*167的帖子

VisualStudio和gcc之间*.dll*.a*.lib*.def的兼容性

这非常令人困惑.我花了很多时间在堆栈上阅读帖子,等等.仍然困惑.

我正在使用Qt和C++进行编码.在Qt中,我使用gcc选项编译器.
问题是我尝试过的许多第三方库似乎都不起作用.

我是.dll,.a,.lib,.def文件和库方案的新手.

问题1:

在我有限的经验中(到目前为止我已经尝试了7或9个库),图书馆的供应商很少告诉你.dll是用VisualStudio还是用gcc制作的.这增加了很多困惑.他们几乎从不清楚库兼容的编译器.所以我很欣赏一些如何应对这场噩梦的真实生活技巧.我尝试过的几乎所有库都是OpenSource项目.我不会在这里命名,但这些都是众所周知的项目.我确定问题是我缺乏知识......

MinGW和gcc World

问题2:
据我所知,MinGW gcc Universe的动态C++库需要这些,对吧?
*.h
*.dll
*.a

问题3:
不幸的是,.a文件经常丢失,库不起作用.这非常令人困惑.如果.a文件丢失,我运气不好?

问题4:
如果*.dll是用gcc制作的,我可以为MinGW/gcc生成.a文件吗?

问题5:如果*.dll是用VisualStudio制作的,我可以为MinGW/gcc生成.a文件吗?

问题6:
*.dll(由MinGW/gcc制作)是否太旧而且不再与较新的MinGW/gcc兼容?

问题7:
使用MinGW/gcc的Qt项目从不需要*.lib文件,对吗?那只是VisualStudio的一件事,对吧?

问题8:
我不需要*.def文件在使用MinGW/gcc的Qt项目中使用*.dll,对吗?

VisualStudio世界

问题9:
据我所知,VisualStudio的动态C++库需要这些:
*.h
*.dll
*.lib

对?同样,问题是*.lib文件几乎总是丢失.此外,没有关于库兼容的编译器的明确说明.那么我怎么知道它只适用于VisualStudio呢?

问题10:
如果缺少.lib文件,我运气不好?

问题11:
如果*.dll是用VisualStudio制作的,我可以为VisualStudio生成.lib文件吗?怎么样?

问题12:
如果*.dll是用MinGW/gcc制作的,我可以为VisualStudio生成.lib文件吗?怎么样?

问题13:
*.dll(使用VisualStudio制作)是否可能太旧并且不再与较新的VisualStudio兼容?

问题14:
如果在QtCreator中我选择了VisualStudio编译器,是否与其他人使用REAL VisualStudio编译的动态库100%兼容?我相信Qt Creator中的VisualStudio编译器选项是伪造的VisualStudio编译器.

问题15:
如果在QtCreator中我选择MinGW/gcc编译器,我可以使用其他人使用REAL VisualStudio编译的Qt动态库吗?

问题16:
我不需要*.def文件在使用MinGW/gcc的Qt项目中使用*.dll,对吗?

问题17:我可以将使用REAL VisualStudio制作的*lib(使用*.dll和*.h)文件转换为*.a文件,这样我就可以将*.a文件与未修改的*.dll一起使用,并且Qt gcc项目中的*.h文件?

c++ qt gcc mingw visual-c++

21
推荐指数
3
解决办法
2万
查看次数

gbit动态与静态链接差异在32位与64位编译中

在Windows 7 64bit中,我使用MinGW-w64(来自MinGW-build项目,由NiXman提供).具体来说,我正在使用x64-4.8.0-release-win32-sjlj-rev2.7z.x64 =开发机器.Win32 =线程模型.这可以编译32位和64位目标.

当我编译并清空cpp文件时只有一个简单的cp main和一个printf行说你好...我是否将它编译为32位或64位之间存在不一致.

当我编译为32位时 g++ -m32 test.cpp

依赖关系是:

  • LIBGCC_S_SJLJ-1.DLL
  • 的libstdc ++ - 6.DLL
  • KERNEL32.DLL
  • MSVCRT.DLL

当我编译为64位时 g++ -m64 test.cpp

依赖关系只是:

  • KERNEL32.DLL
  • MSVCRT.DLL

在64位模式下编译时,我不明白LIBGCC_S_SJLJ-1LIBSTDC++-6依赖项有什么关系.64位C++编译不需要这两件事吗?或者它们是否自动静态链接?

如果他们自动链接到一个而不是另一个,这是什么原因?

我知道我可以用and LIBGCCLIBSTDC++静态链接32位项目.虽然我不确定这是不是很好的做法. -static-libgcc-static-libstdc++

我尝试过-shared-libgcc,-shared-libstdc++以便我的64位编译具有动态依赖性LIBGCC,LIBSTDC++但是当使用–m64标志(编译为64位)时,g ++拒绝动态链接它们.

我已经读过静态链接LIBGCC,这LIBSTDC++是一件坏事,并且它会阻止人们安全地链接到其他第三方动态库中,因为某些东西(我并不真正理解这个说法).

如果有人能够阐明g ++行为的这种差异以及这方面的最佳实践,我将非常感激.

c++ qt g++

9
推荐指数
1
解决办法
855
查看次数

C&C++ String Literal对char*="stringLiteral"的弃用;

我理解语法char*="stringLiteral"; 已被弃用,未来甚至可能无法使用.我不明白的是为什么.

我搜索网和堆栈,虽然有许多回声确认char*="stringLiteral"; 是错的,那个const char*="stringLiteral"; 是核心,我还没有找到有关WHY表示语法错误的信息.换句话说,我想知道问题究竟是什么.

我的困惑

CODE SEGMENT 1 - EVIL WAY(已弃用)

char* szA = "stringLiteralA";     //Works fine as expected. Auto null terminated.
std::cout << szA << std::endl;    
szA = "stringLiteralB";          //Works, so change by something same length OK.
std::cout << szA << std::endl;    
szA = "stringLiteralC_blahblah"; //Works, so change by something longer OK also.
std::cout << szA << std::endl;    

Ouput:
stringLiteralA
stringLiteralB
stringLiteralC_blahblah
Run Code Online (Sandbox Code Playgroud)

那究竟是什么问题呢?似乎工作得很好.

CODE SEGMENT 2("OK"方式)

const char* szA = "stringLiteralA";  //Works fine …
Run Code Online (Sandbox Code Playgroud)

c c++

0
推荐指数
1
解决办法
356
查看次数

标签 统计

c++ ×3

qt ×2

c ×1

g++ ×1

gcc ×1

mingw ×1

visual-c++ ×1