当我在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
。然后揭示公共符号。
答案 0 :(得分:3)
尝试省略__declspec(dllexport)
,这仅适用于DLLs
。如果像
#ifndef __STACKOVERFLOW_EXAMPLE_
#define __STACKOVERFLOW_EXAMPLE_
int test(int magic);
#endif // __STACKOVERFLOW_EXAMPLE_
一切都应该没问题。有关示例,请参阅here。
答案 1 :(得分:0)
甚至不知道你用什么样的选项来编译它,甚至很难给出答案。
但是,无论你在尝试什么,VS提供的C语言支持都很差,但是在VS内部根本没有一些C语言的功能或版本,VS众所周知不是一个非常好的地方。下进行。
我建议切换到MinGW并坚持下去。
答案 2 :(得分:0)
2013年,在Visual Studio 2010中,我创建了非空的静态库,但是dumpbin和lib都没有产生任何输出,无论我说/ all,-all还是/ disasm,其中一个应该说些什么。
文件在Windows上和Linux上说“current ar archive” $ ar tvf MathFuncsLib.lib rw-rw-rw- 100666/100666 16252 Jan 13 15:29 2014 Debug / MathFuncsLib.obj
是的,这是微软用于他们的演练示例的简单数学库(: - ))