【问题标题】:How to build library function? [duplicate]如何构建库功能? [复制]
【发布时间】:2021-08-17 18:50:09
【问题描述】:

我想构建一个小型可重用库。 我有 2 个项目,项目 A 用于构建库函数(必须是动态库),项目 B 用于对其运行测试。

我的问题遇到以下错误: 在项目 B 中,我使用了以下代码:

 #include "StdAfx.h"
 #include "C:\......\projectA\Ent extension.h" (same folder with "Ent extension.cpp")
 void Call_plot()
 {
      ...=fent_select(..);
 }

但是,当我构建项目时,我总是遇到错误:

Error LNK2019 unresolved external symbol "class Ent __cdecl fent_select(wchar_t const ,enum Mode)" (?fent_select@@YAPEAVEnt@@PEB_WW4Mode@Db@@@Z) referenced in function "void __cdecl" Call_plot (?Call_plot@@YAXXZ)

我该如何解决这个问题?

谢谢!

【问题讨论】:

  • @StephenNewell:我以错误的方式构建 projectA.lib 吗?我只是编译并将 projectA.lib 添加到链接器 projectB
  • 您没有为任何人提供足够的信息来提供比解释此链接器错误的许多常见原因的副本更多的帮助。
  • 谢谢大家,原来我错过了__declspec。现在每个功能都按预期工作。
  • 通常在使用 msvc 的原生 c++ 中,您需要一个宏,在构建 dll 时计算为 __declspec(dllexport),在使用 dll 时计算为 __declspec(dllimport)。相关:https://stackoverflow.com/questions/14980649/macro-for-dllexport-dllimport-switch

标签: c++ linker-errors


【解决方案1】:

您需要将两个源代码文件中的目标代码链接在一起(当您编译源代码时,它通常会变成目标代码)。 如何 这样做在某种程度上取决于您的操作系统和编译器。但是,例如使用 GNU 的 gcc 编译器,它将采用以下编译行。

  1. 第一步,编译你想要的基础代码包括:
gcc -g -o Ent_extension.o Ent_extension.cpp
  1. 第 2 步,编译您想要使用扩展的代码,并使用-I(包含路径)告诉它基础项目A 的头文件在哪里:
gcc -I C:\......\projectA\ -g -o project_B.o project_B.cpp

但是在您将它们链接在一起之前,这些文件都不能执行,这是最后一步:

  1. 将它们链接到一个可执行文件中:
gcc -o myprogram project_B.o C:\......\projectA\Ent_extension.o

这将从您的两个代码库中创建 myprogram

注意:更高级的方法是将 projectA 代码转换为库并将其链接到其中,但这应该是未来的任务。

【讨论】:

  • 谢谢,这对我下次一定有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多