3

当我在 VS2010 中编写和编译一个 lib 文件时,我遗漏了一些东西。我不知何故没有正确标记它们以供出口。

控制台命令dumpbin.exe -headers mylib.lib > stackoverflow.txt生成以下输出。(我删除了空行)

 Microsoft (R) COFF/PE Dumper Version 10.00.30319.01 Copyright (C)
 Microsoft Corporation.  All rights reserved.
 Dump of file mylib.lib
 File Type: LIBRARY
 ANON OBJECT HEADER VALUES
                1 version
              14C machine (x86)
         515AC7B8 time date stamp Tue Apr 02 13:57:44 2013
                  ClassID: {0CB3FE38-D9A5-4DAB-AC9B-D6B6222653C2}
             171A size
                0 flags

我创建了一个新的空项目。新项目是一个没有预编译头文件的空静态库项目。我将它命名为 mylib。之后我创建了两个文件。c 文件以 .c 结尾 - 这将其标记为 ansi-c 文件,编译器会将其编译为 ansi-c。

mylib.h

#ifndef __STACKOVERFLOW_EXAMPLE_
#define __STACKOVERFLOW_EXAMPLE_

__declspec(dllexport) int test(int magic);

#endif // __STACKOVERFLOW_EXAMPLE_

mylib.c

#include "mylib.h"

int test(int magic){
    return magic * 7;
}

这里可能出了什么问题?为什么我的 lib 文件不包含符号?


编辑1:

放弃__declspec(dllexport)似乎是合理的。

mylib.h

#ifndef __STACKOVERFLOW_EXAMPLE_
#define __STACKOVERFLOW_EXAMPLE_

int test(int magic);

#endif // __STACKOVERFLOW_EXAMPLE_

我现在尝试了这个,但不幸的是它并没有改变结果。lib文件中仍然没有符号。


编辑2:

谜题的第二部分是我的控制台命令来显示符号。正确的命令是dumpbin.exe -all mylib.lib > stackoverflow.txt。之后,公共符号被揭示。

4

3 回答 3

3

尽量省略__declspec(dllexport),这仅用于DLLs。如果你编译你的文件就像

#ifndef __STACKOVERFLOW_EXAMPLE_
#define __STACKOVERFLOW_EXAMPLE_

int test(int magic);

#endif // __STACKOVERFLOW_EXAMPLE_

一切都应该没问题。有关示例,请参见此处。

于 2013-04-02T13:29:58.910 回答
0

甚至不知道你用什么样的选项来编译它,甚至很难给出答案。

但是,无论您尝试什么,VS 对 C 语言的支持真的很差,C 语言的某些功能或版本在 VS 中根本不可用,众所周知,VS 不是 C 语言的好地方。

我建议切换到MinGW并坚持下去。

于 2013-04-02T13:28:51.787 回答
0

在 2013 年,使用 Visual Studio 2010,我创建了非空静态库,但无论我说 /all、-all 还是 /disasm,dumpbin 和 lib 都不会产生任何输出,其中一个应该说些什么。

文件在 Windows 和 linux 上显示“当前 ar 存档”,$ ar tvf MathFuncsLib.lib rw-rw-rw- 100666/100666 16252 Jan 13 15:29 2014 Debug/MathFuncsLib.obj

是的,这是微软在他们的演练示例中使用的微不足道的数学库 (:-))

于 2014-01-14T17:22:55.957 回答