水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
下页
|
尾页
|
1/2
|
转到
主题:[求助]一个lib库,里面的函数只能在static函数中调用
楼主
|
baddif
|
2023-11-07 16:26:42
|
只看此ID
用普通函数调用就报无法解析的外部符号__imp_xxx
用自己的static函数封装也不行,只要封装有普通函数就报错。
直接用main函数调用可以。
本身拿到的是一个控制台的demo,想简单加个mfc界面,结果怎么也编译不通。
这是什么原因,lib里设置了static函数?
有没有办法绕过这个限制?
求指点,谢谢
--
FROM 106.11.194.*
1楼
|
poocp
|
2023-11-07 21:09:00
|
只看此ID
VC++的main()是__cdecl调用约定的,所以如果那个库里面的函数只能在main()函数中调用,那可能也是__cdecl调用约定的。
而MFC是__stdcall调用约定的,你要用那个lib库里的函数,需要声明为C调用约定。才能在MFC的函数里使用。
不过链接报错无法解析外部符号,也有可能是链接库问题或者次序问题,你可以在工程的属性下面,链接器,命令行加一个开关
/verbose:lib 重新链接一下控制台demo和MFC的程序,对比一下用到了哪些库,MFC那边是不是漏掉了库,所以报错无法解析外部符号。
--
FROM 171.88.149.*
2楼
|
baddif
|
2023-11-07 21:41:50
|
只看此ID
谢谢,明天试一下
漏掉库可能性不大,因为static调用就正常编译通过了……
【 在 poocp 的大作中提到: 】
: VC++的main()是__cdecl调用约定的,所以如果那个库里面的函数只能在main()函数中调用,那可能也是__cdecl调用约定的。
: 而MFC是__stdcall调用约定的,你要用那个lib库里的函数,需要声明为C调用约定。才能在MFC的函数里使用。
: 不过链接报错无法解析外部符号,也有可能是链接库问题或者次序问题,你可以在工程的属性下面,链接器,命令行加一个开关
: ...................
--
FROM 117.186.4.*
3楼
|
z16166
|
2023-11-08 00:21:25
|
只看此ID
具体的出错信息是啥
--
FROM 221.218.160.*
4楼
|
baddif
|
2023-11-08 10:11:28
|
只看此ID
就是三个lib库里的函数找不到符号。
用static函数调用就不报错。
【 在 z16166 的大作中提到: 】
: 具体的出错信息是啥
--
FROM 106.11.194.*
5楼
|
z16166
|
2023-11-08 12:23:01
|
只看此ID
被调用的lib里的符号的可见性(而且windows上没有ELF文件里的那种复杂可见性),应该是不受调用者的制约的
__imp_xxx那种看着是调用API的地方,不涉及隐私的编译/链接错误,可以完整贴出来,或者提供最小demo,自己转述是不准确的。
VS有verbose linking选项,打印一下link过程就知道了
实在不行,被调用者、调用者都反汇编看看,c++的name有decoration,类型不同的话,实际的符号是不同的。
【 在 baddif 的大作中提到: 】
: 就是三个lib库里的函数找不到符号。
: 用static函数调用就不报错。
--
修改:z16166 FROM 221.218.160.*
FROM 221.218.160.*
6楼
|
baddif
|
2023-11-08 15:52:57
|
只看此ID
也不是保密啥的,确实是没有有效提示信息,错误就是无法解析的外部符号,三个lib里的函数都有这个提示。
但如果把调用这三个函数的外部函数设为static,就能编译。但这个外部函数只要被非static函数调用,就有同样的问题。
目前我直接修改了提供的头文件,把每个函数前面的__declspec(dllimport)直接删除,编译就通过了,但是调用结果是不是对的还在考察
--
FROM 223.104.5.*
7楼
|
z16166
|
2023-11-08 17:24:58
|
只看此ID
__declspec(dllimport)是会影响编译器生成的调用方式的
一种是直接call, 另外一种是通过间址来call,也就是你看到的__imp_xxx这种间址。
https://learn.microsoft.com/en-us/cpp/build/importing-function-calls-using-declspec-dllimport?view=msvc-170
纯静态库是不需要用__declspec(dllimport)之类的
你的提供方给的是非静态lib + dll?
【 在 baddif 的大作中提到: 】
: 也不是保密啥的,确实是没有有效提示信息,错误就是无法解析的外部符号,三个lib里的函数都有这个提示。
: 但如果把调用这三个函数的外部函数设为static,就能编译。但这个外部函数只要被非static函数调用,就有同样的问题。
: 目前我直接修改了提供的头文件,把每个函数前面的__declspec(dllimport)直接删除,编译就通过了,但是调用结果是不是对的还在考察
--
修改:z16166 FROM 221.218.160.*
FROM 221.218.160.*
8楼
|
baddif
|
2023-11-08 18:05:18
|
只看此ID
给了一个lib文件和头文件……还不确定现在有什么问题……
【 在 z16166 的大作中提到: 】
: __declspec(dllimport)是会影响编译器生成的调用方式的
: 一种是直接call, 另外一种是通过间址来call,也就是你看到的__imp_xxx这种间址。
:
https://learn.microsoft.com/en-us/cpp/build/importing-function-calls-using-declspec-dllimport?view=msvc-170
: ...................
--
FROM 106.11.194.*
9楼
|
z16166
|
2023-11-08 18:09:27
|
只看此ID
没有dll,那就是个纯静态库,不需要用dllimport那些东西。
【 在 baddif 的大作中提到: 】
: 给了一个lib文件和头文件……还不确定现在有什么问题……
--
FROM 221.218.160.*
下页
|
尾页
|
1/2
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版