如何 link 一个包含其他第三方 C 库的 C++ project_A 到另一个 project_B

How to link a C++ project_A which includes other third party C libraries to another project_B

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

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

#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 错误。 有什么想法吗?

抱歉,无法为您的项目设置包含路径。也许,您可以帮助完成这项任务,但是,请查看 here.

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

编辑(回复您的评论):

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