当我用VS2010编写和编译库文件时,我遗漏了一些东西。我不知怎么没把它们标上正确的出口标记。
控制台命令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_我现在试过了,但不幸的是,它并没有改变结果。库文件中仍然没有符号。
编辑2:
拼图的第二部分是我的控制台命令,用来显示符号。正确的命令是dumpbin.exe -all mylib.lib > stackoverflow.txt。之后,这些公共符号就被揭露了。
发布于 2013-04-02 13:29:58
尝试省略__declspec(dllexport),这将仅用于DLLs。如果您编译您的文件就像
#ifndef __STACKOVERFLOW_EXAMPLE_
#define __STACKOVERFLOW_EXAMPLE_
int test(int magic);
#endif // __STACKOVERFLOW_EXAMPLE_一切都会好起来的。有关示例,请参见这里。
发布于 2013-04-02 13:28:51
甚至不知道您曾经编译过的选项是什么,甚至很难给出答案。
但是,不管您在尝试什么,VS对C语言的支持都很差,有些特性或C语言的版本在VS中根本无法使用,VS对于C语言来说并不是一个很好的地方。
我建议改用MinGW并坚持使用它。
发布于 2014-01-14 17:22:55
2013年,在Visual 2010中,我创建了非空的静态库,但无论是/all、-all还是/disasm,无论是dumpbin还是lib都不会产生任何输出,其中之一应该有所说明。
文件上写着“当前的ar存档”,在Windows和linux上,$ ar MathFuncsLib.lib rw- 100666/100666 1月13日15:29 2014年调试/MathFuncsLib.obj
是的,这是微软在浏览示例(:-)时使用的简单的数学库。
https://stackoverflow.com/questions/15765321
复制相似问题