这非常令人困惑.我花了很多时间在堆栈上阅读帖子,等等.仍然困惑.
我正在使用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文件?
在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位之间存在不一致.
g++ -m32 test.cpp依赖关系是:
g++ -m64 test.cpp依赖关系只是:
在64位模式下编译时,我不明白LIBGCC_S_SJLJ-1与LIBSTDC++-6依赖项有什么关系.64位C++编译不需要这两件事吗?或者它们是否自动静态链接?
如果他们自动链接到一个而不是另一个,这是什么原因?
我知道我可以用and LIBGCC和LIBSTDC++静态链接32位项目.虽然我不确定这是不是很好的做法. -static-libgcc-static-libstdc++
我尝试过-shared-libgcc,-shared-libstdc++以便我的64位编译具有动态依赖性LIBGCC,LIBSTDC++但是当使用–m64标志(编译为64位)时,g ++拒绝动态链接它们.
我已经读过静态链接LIBGCC,这LIBSTDC++是一件坏事,并且它会阻止人们安全地链接到其他第三方动态库中,因为某些东西(我并不真正理解这个说法).
如果有人能够阐明g ++行为的这种差异以及这方面的最佳实践,我将非常感激.
我理解语法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)