体系结构的未定义符号 x86_64:“RtMidiIn::RtMidiIn

Undefined symbols for architecture x86_64: "RtMidiIn::RtMidiIn

我正在尝试从现有程序连接到 MIDI 设备。 RtMidi 是一个流行的库。据我所知,我所要做的就是将 RtMidi.cpp 和 RtMidi.h 放入包含其余源代码的目录中,然后照常构建。我这样做了,并添加到加载的主要 类 之一:

#include "RtMidi.h"

构造函数中只有这个:

RtMidiIn *midiin = new RtMidiIn();

只是为了看看是否编译了那么多。但我得到以下信息:

Undefined symbols for architecture x86_64:
  "RtMidiIn::RtMidiIn(RtMidi::Api, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int)", referenced from:
      spotify::playback::AudioDecompressorProcess::AudioDecompressorProcess(spotify::playback::AudioSinkChain const&, std::__1::function<std::__1::unique_ptr<spotify::playback::AudioDecompressor, std::__1::default_delete<spotify::playback::AudioDecompressor> > (spotify::tl::span<unsigned char const>)> const&, bool, spotify::playback::PlaybackInstrumentation&, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l> >, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000l> >) in libplayback.a(audio_decompressor_process.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

** BUILD FAILED **


The following build commands failed:
    Ld /Users/acheong/src/spotify/client-web/desktop/shell/build/desktop/Debug/Spotify.app/Contents/MacOS/Spotify normal (in target 'Spotify' from project 'spotify')

我发现 this thread 建议定义 __MACOSX_CORE__。我以两种方式尝试了这个。首先,在 include:

之前使用 #define
#define __MACOSX_CORE__
#include "RtMidi.h"

同样的错误。其次,将此添加到 xcodebuild 命令行:

GCC_PREPROCESSOR_DEFINITIONS='$GCC_PREPROCESSOR_DEFINITIONS __MACOSX_CORE__'

同样的错误。 (虽然这些肯定在做 一些事情 ,因为当我不小心同时尝试以上两个时,我得到一个宏已经定义的错误。)

我不是很熟悉 C++ 构建链,所以我不确定我是否只是在做一些愚蠢的事情——比如,我是否需要更新一些 Makefile 或其他东西让编译器“看到”RtMidi .cpp/h——或者这是我在某些线程中读到的某种兼容性问题。

@AdrianMole 是对的——我必须明确指示 CMake 构建 RtMidi 文件。我在 SOURCES 下的相关 CMakeLists.txt 中添加了文件:

sp_add_sources(TARGET playback
  FOLDER "src"
  ROOT "src"
  SOURCES
    RtMidi.cpp
    RtMidi.h
    audio_buffered_sink.cpp
    audio_buffered_sink.h
    audio_container_format.cpp
    ...

并且还添加了这个:

target_link_libraries(playback PRIVATE "-framework CoreMIDI")

然后我可以在现有程序中包含“RtMidi.h”,并添加示例代码,

RtMidiIn *midiin = new RtMidiIn();
// Check available ports.
unsigned int nPorts = midiin->getPortCount();
...

并成功构建所有内容,甚至在任何地方都不需要 __MACOSX_CORE__