”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何解决 VS2010 中混合 C 和 C++ 项目中的 LNK2001 链接器错误?

如何解决 VS2010 中混合 C 和 C++ 项目中的 LNK2001 链接器错误?

发布于2024-12-21
浏览:610

How to Resolve LNK2001 Linker Errors in Mixed C and C   Projects in VS2010?

解决 VS2010 中混合 C 和 C 项目中的链接器错误

问题描述

将 C 代码集成到不同 VS2010 项目中的 C 项目中导致从 C 代码调用 C 函数时出现链接错误。该错误标识为 LNK2001,与未解析的外部符号有关。

解决方案

要纠正此问题,请遵循特定准则来确保代码库的正确组织:

  1. 模块化代码:

    • 每个C模块应包含一个头文件和一个源文件。
    • 保持文件和宏命名约定的一致性。
  2. 创建标头和实施文件:

    • 在头文件(例如,functions.h)中定义函数并在源文件(例如,functions.c)中实现它们。
  3. 管理出口和进口:

    • 利用FUNCTIONS_EXPORT_API 宏用于在头文件中标记要导出(或导入)的函数。
    • 在使用函数的项目中包含头文件时,请勿定义 FUNCTIONS_EXPORT_API(或使用其导入值定义宏)。
    • 在包含函数之前,确保导出函数的项目已定义(自动或手动)FUNCTIONS_EXPORT 宏header.

示例代码

functions.h

#pragma once

#define FUNCTIONS_EXPORT_API

#if defined(__cplusplus)
extern "C" {
#endif

FUNCTIONS_EXPORT_API char *dtoa(double, int, int, int*, int*, char**);
FUNCTIONS_EXPORT_API char *g_fmt(char*, double);
FUNCTIONS_EXPORT_API void freedtoa(char*);

#if defined(__cplusplus)
}
#endif

functions.c

#define FUNCTIONS_EXPORTS
#include "functions.h"

char *dtoa(double, int, int, int*, int*, char**)
{
    // Function implementation
}

char *g_fmt(char*, double)
{
    // Function implementation
}

void freedtoa(char*)
{
    // Function implementation
}

其他注意事项

  • 避免在标头内的函数声明中使用外部存储说明符。
  • 利用项目特定的宏(例如 EXPORTFUNCTIONSPROJECT_EXPORTS)来自动化Exports.
  • 验证预处理器下项目属性中的宏名称定义。

相关问题

  • [CLR Windows 窗体中的 LNK2005 错误](https://stackoverflow.com/a/17362530/1128974)
  • [Excel VBA,无法从 DLL 中找到 DLL 入口点文件](https://stackoverflow.com/a/7214325/1128974)
  • [在库中使用 fstream 时,我在可执行文件中遇到链接器错误](https://stackoverflow.com/a/10068252 /1128974)
  • [C dll 导出未定义](https://stackoverflow.com/a/7709927/1128974)
最新教程 更多>
  • Go 是否为 Goroutine 特定数据提供 ThreadLocal 等效项?
    Go 是否为 Goroutine 特定数据提供 ThreadLocal 等效项?
    了解 Go 中的 Goroutine-本地存储在使用 Go 时,开发者经常会遇到需要跟踪与特定 Goroutine 相关的信息的情况。在 Java 等其他语言中,ThreadLocal 为该任务提供了一个优雅的解决方案。 Go 是否提供类似的机制?Go 的 Goroutine 本地存储方法Go 的标...
    编程 发布于2024-12-21
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-12-21
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    编程 发布于2024-12-21
  • 如何使用 Prototype.js 实现自动调整文本区域大小的功能?
    如何使用 Prototype.js 实现自动调整文本区域大小的功能?
    使用 Prototype 实现自动调整大小的 TextArea要增强内部销售应用程序中的用户体验,请考虑向用于送货地址的文本区域。以下是实现此目的的详细指南:目标是创建一个可以动态调整其高度以适应文本输入的文本区域,确保最佳的空间利用率和可读性。为此,我们将利用 JavaScript 框架 Prot...
    编程 发布于2024-12-21
  • Spring Boot如何配置多个数据源?
    Spring Boot如何配置多个数据源?
    在Spring Boot中配置多个数据源在Spring Boot中,使用多个数据源可以让你隔离不同实体的数据访问管理或应用程序。为了实现这一点,使用了 application.properties 文件和 Bean 配置方法。application.properties要添加第二个数据源,请在 ap...
    编程 发布于2024-12-21
  • 为什么 C++ 中的零长度数组会导致错误 2233,如何修复它?
    为什么 C++ 中的零长度数组会导致错误 2233,如何修复它?
    在 C 中处理“零长度数组” 在 C 中,在遗留代码中可能会遇到“零长度数组”的情况。这涉及包含长度为零的数组的结构。虽然警告被编译指示抑制,但创建包含此类数组的新结构可能会导致错误 2233。为什么会发生这种情况,可以采取什么措施来解决它?使用零长度数组的原因是一个历史原因允许动态分配数组的 C ...
    编程 发布于2024-12-21
  • 如何设置 HTML `` 标签的样式并确保其可见性?
    如何设置 HTML `` 标签的样式并确保其可见性?
    HTML标签的样式和可见性问题声明在HTML中,标签用于定义一个区域可以链接到另一个资源的图像。然而,用户在设计样式并使这些区域始终可见方面遇到了困难。jQuery 插件解决方案克服这一挑战的一种方法是利用 MapHilight jQuery 插件。该插件提供了使用 CSS 悬停效果突出显示图像地图...
    编程 发布于2024-12-21
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-12-21
  • 访问类中的数据库对象时如何避免全局变量?
    访问类中的数据库对象时如何避免全局变量?
    在类中使用全局变量创建分页功能涉及从类中访问数据库对象。但是,尝试访问类内部的外部变量可能会导致错误。让我们深入研究处理此问题的可能解决方案。为了解决致命错误“在非对象上调用成员函数 query()”,数据库对象需要在类中可访问。不使用全局变量,更合适的方法是将数据库对象注入到类或其方法中。依赖注入...
    编程 发布于2024-12-21
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-12-21
  • 如何在C++中生成特定范围内均匀分布的随机数?
    如何在C++中生成特定范围内均匀分布的随机数?
    跨范围均匀随机数生成您寻求一种在指定范围[min, max]内均匀生成随机数的方法。 rand 的缺陷您当前使用 rand() 和模运算符的实现可能无法确保均匀分布,因为它的行为取决于 RAND_MAX 和范围本身。C 11 和统一范围生成在 C 11 中,std::uniform_int_dist...
    编程 发布于2024-12-21
  • 如何在 Jackson 序列化期间抑制空字段值?
    如何在 Jackson 序列化期间抑制空字段值?
    处理 Jackson 序列化中的空字段值Jackson 是一个流行的 Java 序列化库,提供了各种配置选项来定制其序列化行为。一种常见的情况是抑制空字段值的序列化。这可确保序列化输出中仅包含非空属性。配置 Jackson 进行空值抑制指示 Jackson 忽略 null 有两种主要方法序列化期间的...
    编程 发布于2024-12-21
  • JavaScript 如何检测浏览器选项卡活动?
    JavaScript 如何检测浏览器选项卡活动?
    使用 JavaScript 确定浏览器选项卡活动在 Web 开发中,通常需要检测浏览器选项卡是否正在活跃使用。当选项卡位于后台时,此功能可以通过暂停或优化任务来实现高效的资源分配。确定选项卡活动的一种方法是通过页面可见性 API。此 API 提供了一个简单的布尔属性 document.hidden,...
    编程 发布于2024-12-21
  • 插入数据时如何修复“常规错误:2006 MySQL 服务器已消失”?
    插入数据时如何修复“常规错误:2006 MySQL 服务器已消失”?
    插入记录时如何解决“一般错误:2006 MySQL 服务器已消失”介绍:将数据插入 MySQL 数据库有时会导致错误“一般错误:2006 MySQL 服务器已消失”。当与服务器的连接丢失时会出现此错误,通常是由于 MySQL 配置中的两个变量之一所致。解决方案:解决此错误的关键是调整wait_tim...
    编程 发布于2024-12-21
  • C++ 中数组长度有哪些限制以及如何克服它们?
    C++ 中数组长度有哪些限制以及如何克服它们?
    研究 C 中的数组长度限制 尽管 C 数组具有巨大的实用性,但对其大小施加了一定的限制。这些限制的程度取决于几个因素,即编译器、系统硬件,甚至数组的数据类型。可变长度强制与普遍看法相反, C 并没有严格执行数组长度的绝对限制。相反,它依赖编译器和系统规范来确定最大大小。这种灵活性允许根据硬件功能进行...
    编程 发布于2024-12-21

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3