【发布时间】:2023-03-15 03:13:01
【问题描述】:
编辑:
问题已解决,见下文。
我正在尝试生成一个静态库(不是导入库)。 我想将一些 C/C++ 代码导出到汇编程序项目中。我过去曾这样做过,但完全忘记了如何做到这一点,而且似乎没有任何效果。
对于我的调试代码,我使用以下 C/C++ 代码 (export.cpp):
extern "C"
static
int Add(int a, int b)
{
return a + b;
}
我这样编译(生成export.obj & export.lib):
cl /c /EHsc export.cpp && lib export.obj
Dumpbin 给了我以下输出(dumpbin /EXPORTS export.lib):
Dump of file export.lib
File Type: LIBRARY
Summary
B0 .debug$S
2F .drectve
我希望得到以下输出(近似值):
File Type: LIBRARY
Exports
ordinal name
_Add@8
[snip]
为什么编译器/链接器不导出我的符号?
PS。
尝试的其他函数定义有:
extern "C" __declspec(dllexport) ...
__declspec(dllexport) int ..
extern "C" int ...
extern int ..
我几乎可以肯定其中一个应该有效,但我找不到其他遇到此问题的人(或者我无法谷歌)。
/SYMBOLS 标志确实表明该函数已链接到目标文件:
008 00000000 SECT3 notype () External | _Add
编辑:
问题解决了,我应该少依赖我认为我知道的...
静态库只是在单个 .lib 文件中添加的一堆 .obj 文件。我的符号(因为它是可见的)一直可用于我的装配项目。
问题是我的程序集文件中的函数定义与 .lib 文件中的符号名称不匹配。
【问题讨论】:
-
没有语言“C/C++”
-
当前代码将编译为 C 或 C++ 代码。因此,代码的语言是 C/C++。
-
那不是有效的 C 代码。
extern "C"是 - 出于显而易见的原因 - 不是 C。 -
不要编辑您的问题来回答。相反,发布您的问题的答案!并且:不,“静态库只是在单个 .lib 文件中添加的一堆 .obj 文件”是错误的。那是一个档案/图书馆(猜猜这就是扩展的意思)。而且,是的,这是 C++ 特有的,因为 C++ 使用名称修饰。
标签: c++ windows linker static-linking