【问题标题】:How to link a C++ project_A which includes other third party C libraries to another project_B如何将包含其他第三方 C 库的 C++ 项目_A 链接到另一个项目_B
【发布时间】:2016-09-09 05:12:03
【问题描述】:

我认为这是一个基本问题,但是我找不到任何关于这个主题的足够帖子,或者我可能只是太愚蠢地正确搜索......

我在两个不同的解决方案中有两个项目。项目 A 是一个应用程序(.exe),使用像 ffmpeg(本机 C)这样的第三方库,项目 B 是一个 DLL,它想要使用项目 A 的代码(目的:AC# 项目假设通过项目使用项目 A 的功能乙)。 从我的角度来看,我只需要添加到项目 A 的包含路径,以便包含它的源文件并将链接器输入设置为项目 B .obj。 但是,在编译Project B时,MSVS找不到一个ffmpeg Header的头文件“libavutil/opt.h”:

#pragma once
extern "C"
{
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
#include <libavutil/channel_layout.h>
#include <libavutil/common.h>
#include <libavutil/imgutils.h>
#include <libavutil/mathematics.h>
#include <libavutil/samplefmt.h>
}

fatal error C1083: Cannot open include file: 'libavutil/opt.h': No such file or directory.

我真的必须为那些 ffmpeg 库设置包含路径吗? 如果这样做,我会收到许多 LNK2001、2005 和 2019 错误。 有什么想法吗?

【问题讨论】:

  • 您必须告诉它要在哪个目录中查找 libavutil/opt.h。如何执行取决于您使用的编译器

标签: c# c++ linker include


【解决方案1】:

抱歉,无法为您的项目设置包含路径。不过,您可能会促进这项任务,但请查看here

您可能会考虑完全重新设计:如果项目 B 使用来自项目 A 的代码,您可能希望将所有代码移动到项目 B 并让项目 A 也使用 DLL。如果您发现将 EXE 项目设置为 DLL 比设置包含路径更容易,您可以切换 A 和 B 的角色,重命名它们并适当地更改它们的类型,并移动保留在DLL 到项目 B,使用项目 A 作为 DLL。

编辑(回应您的评论):

  • 项目 DLL:
    接收将在 C++ exe 和 C# exe 之间共享的所有代码,包括与 ffmpeg 的链接等。
  • 项目 C++ EXE:
    接收前一个项目 A 的剩余部分。将利用项目 DLL(更准确地说:从那里输出的 DLL)再次获取之前直接合并的任何内容。
  • 项目 C# EXE: 如你之前所愿。当然,托管代码和非托管代码之间的所有编组仍然存在(无论如何,您之前都必须这样做)。

【讨论】:

  • 我对重新设计没有任何问题,只要我可以调用一个 C++ 函数,该函数从 C# 项目中实现了那些 ffmpeg 库。那你会推荐什么结构?
  • @Richard 我在回复中包含了一个提议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多