今天,在使用Qt+VS2019编译工程时,弹出"无法定位程序输入点xxx于动态链接库"问题,如图(1)所示:
![](https://img-blog.csdnimg.cn/direct/cc41a556217a4202b3e5b5860ad06d05.png)
出现这种问题的原因有很多:
- (1) 工程Release/Debug,与lib的Release/Debug不一致;
- (2)Qt的Path环境没有设置好,应该区分工程的32或64位,MSVC或MingW路径;
- (3) 子类没有实现父类的虚函数,导致编译报错。
解决方法如下:
1 将lib库版本与工程的版本保持一致
- 若工程是Release版本的,则引用的lib要改成Release的;
- 若工程师Debug版本的,则引用的lib要改成Debug的;
- 即Release lib + Release vs.sln
- Debug lib + Debug vs.sln
比如工程本身是Debug版本,而第三方lib库是Release的,则需要将工程改成Release版本,如图(2)所示:
在VS里,将菜单栏改成Release,右击工程 --》属性 --》也改成Release --》应用。
![](https://img-blog.csdnimg.cn/direct/80d17a727e9542268589491796a21906.png)
2 设置正确的Qt环境变量
Qt环境变量,包括2种:(A)Qt插件+VS环境,(B)纯Qt环境;
(A)、(B)这2种环境,不要同时配置到Path里。若同时配置到Path,编译器会无法识别,造成编译失败。
2.1 Qt插件+VS环境
若工程是Qt-addin插件+VS编译的,则选择MSVC环境变量;
64位 MSVC
path = D:\Qt\Qt5.14.2\5.14.2\msvc2017_64\bin;D:\Qt\Qt5.14.2\Tools\QtCreator\bin;
64位的msvc Qt环境,如图(3)所示:
![](https://img-blog.csdnimg.cn/direct/b0d7670ff82e4e209cb7a26ba328b5ca.png)
32位 msvc
path = D:\Qt\Qt5.14.2\5.14.2\msvc2017\bin;D:\Qt\Qt5.14.2\Tools\QtCreator\bin;
32位的msvc Qt环境,如图(4)所示:
![](https://img-blog.csdnimg.cn/direct/c5bb183a40464d5bad327f41e233723e.png)
2.2 纯Qt环境
若工程是纯Qt编译,即采用Qt Creator编译,则选择MingW环境。
64位 mingw64
path = D:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin;D:\Qt\Qt5.14.2\Tools\mingw730_64\bin;
64位的MIingW64路径,如图(5)所示:
![](https://img-blog.csdnimg.cn/direct/ff3d7a9d7d9e44e2b23e7a030cac7ac4.png)
32位 mingw32
path = D:\Qt\Qt5.14.2\5.14.2\mingw73_32\bin;D:\Qt\Qt5.14.2\Tools\mingw730_32\bin;
32位的MIingW32路径,如图(6)所示:
![](https://img-blog.csdnimg.cn/direct/609e9ec1ef7c40f985e060ada0d44b4c.png)
2.3 重启电脑
配置Qt的Path环境变量之后,要重启电脑,环境才生效。
按Alt+F4快捷键,选中"重启"下拉框即可重启。
3 实现父类的虚函数
有些lib库继承了一个虚函数类,这个虚函数需要在子类里手动实现。可以在子类里加一个同名的函数覆盖它,先保证编译通过,再去调试相应的子模块。
//父类: Father
class Father {
public:
Father() {}
~Father() {}
virtual void Print() = 0;
};
//子类:Child
class Child :Father {
public:
Child() {}
~Child() {}
//重写父类的虚函数
void Print() { std::cout << "hello\n"; };
};