如何使用visual studio 2010编写静态ansi-c库
当我在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
。 然后揭示公共符号。
尝试省略__declspec(dllexport)
,这只能用于DLLs
。 如果您编译文件就像
#ifndef __STACKOVERFLOW_EXAMPLE_ #define __STACKOVERFLOW_EXAMPLE_ int test(int magic); #endif // __STACKOVERFLOW_EXAMPLE_
一切都应该没问题。 请看这里的例子。
甚至不知道你用什么样的选项来编译它,甚至很难尝试给出答案。
但是,无论你在尝试什么,VS提供的C语言支持都很差,一些function或版本的C语言在VS内部根本不可用,VS众所周知不是C的真正好地方。
我建议切换到MinGW并坚持下去。
在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
是的,这是微软用于他们的演练示例的简单数学库(:-))