- 主题:[求助]一个lib库,里面的函数只能在static函数中调用
具体的出错信息是啥
--
FROM 221.218.160.*
被调用的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.*
__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.*
没有dll,那就是个纯静态库,不需要用dllimport那些东西。
【 在 baddif 的大作中提到: 】
: 给了一个lib文件和头文件……还不确定现在有什么问题……
--
FROM 221.218.160.*
calling convention影响运行时(可能崩掉),不影响编译时
【 在 poocp 的大作中提到: 】
: VC++的main()是__cdecl调用约定的,所以如果那个库里面的函数只能在main()函数中调用,那可能也是__cdecl调用约定的。
: 而MFC是__stdcall调用约定的,你要用那个lib库里的函数,需要声明为C调用约定。才能在MFC的函数里使用。
: 不过链接报错无法解析外部符号,也有可能是链接库问题或者次序问题,你可以在工程的属性下面,链接器,命令行加一个开关
: ...................
--
FROM 221.218.160.*
C和C++是肯定不一样的,C只是在函数名前面加个下划线,C++要做多一点mangling
我想说的是下面两个mangle之后的名字是一样的
int __stdcall func() { return 2; }
int __cdecl func() { return 2; }
【 在 poocp 的大作中提到: 】
: 也影响,因为符号的命名规则不一样,链接时名称不同会找不到符号。
: 从生成的汇编上看,两个符号分别如下,名称不对应的话,链接会失败。
: c_function
: ...................
--
FROM 221.218.160.*
好的。谢谢
【 在 poocp (慢速随机指标) 的大作中提到: 】
: 这以前在也16位的MSC++和32位MSVC++的时候名称约定也是分开的,就是因为分得太多实在麻烦,也给链接造成问题,到了64位MSVC++才合并了。
: 32位下的符号名称,__cdecl的是@YA,而__stdcall是@YG,main()函数是_main(64位下是main)。就是因为这样太麻烦,到64位才全部改回@YA了。
: PUBLIC ?c_function@@YAHXZ ; c_function
: PUBLIC ?stdcall_function@@YGHXZ ; stdcall_function
--
FROM 114.254.10.*