如何使用visual studio 2010编写静态ansi-c库

时间:2013-04-02 13:25:04

标签: c visual-studio-2010 static-libraries

当我在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。然后揭示公共符号。

3 个答案:

答案 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

是的,这是微软用于他们的演练示例的简单数学库(: - ))