【问题标题】:MVC++ Static library not generating any exportsMVC++ 静态库不生成任何导出
【发布时间】: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


【解决方案1】:

我相信您在 C 和 C++ 之间创建外部函数时正在寻找这种性质的东西。

#ifdef __cplusplus
extern “C” {
#endif

// Function declarations go here, etc.

#ifdef __cplusplus
}
#endif

这允许您的函数被 C 链接器“启用”。希望这就是您想要的。

【讨论】:

  • 这不起作用,.lib 文件中已经存在 C 符号。但实际上没有导出任何符号。不过感谢您的建议。
  • @user513647 - 您是否尝试过如下定义链接:#ifdef EXPORTING_XYZ_DLL_SYMS #define XYZ_LINKAGE __declspec(dllexport) #else #define XYZ_LINKAGE __declspec(dllimport) #endif 我在这里找到了信息 - lurklurk.org/linkers/linkers.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多