体系结构的未定义符号 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__
。
我正在尝试从现有程序连接到 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__
。