0

私は、Xcode の快適さから書いてきたので、しばらく取り組んできた C++ ライブラリ プロジェクトを持っています。make を使用してコンパイルするようにプロジェクトをセットアップして、必要なときに配布しやすくすることにしました。プロジェクトには現在、約 40 のヘッダーと 30 の .cpp ファイルがあります。

エラー:

Undefined symbols for architecture x86_64:
  "std::__1::__vector_base_common<true>::__throw_length_error() const", referenced from:
      void std::__1::vector<DSG::SignalProcess*, std::__1::allocator<DSG::SignalProcess*> >::__push_back_slow_path<DSG::SignalProcess* const&>(DSG::SignalProcess* const&) in AudioSettings.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [lib/DSG.dylib] Error 1

メイクファイル:

.PHONY : clean install

CC = g++-4.9
CPPFLAGS= -fPIC -g -std=gnu++11 -Os -Wall -I/usr/local/include 
LDFLAGS= -dynamiclib 


SOURCES = $(wildcard src/*.cpp)
HEADERS = $(wildcard src/*.h)
OBJECTS = $(SOURCES:.cpp=.o)

DSG_LIBDIR = lib

DSG_HEADERINSTALLDIR = /usr/local/include/DSG
DSG_LIBINSTALLDIR = /usr/local/lib

TARGET=$(DSG_LIBDIR)/DSG.dylib

all: $(TARGET)

clean:
    rm -f $(OBJECTS) $(TARGET)

install: 
    cp -f $(TARGET) $(DSG_LIBINSTALLDIR) 
    mkdir -p $(DSG_HEADERINSTALLDIR)
    cp -f $(HEADERS) $(DSG_HEADERINSTALLDIR)

$(TARGET): $(OBJECTS)
    $(CC) $(CPPFLAGS) $(OBJECTS) -o $@ $(LDFLAGS)

ヘッダー:

#ifndef __DSG__AudioSettings__
#define __DSG__AudioSettings__
#include <vector>
#include "DSGTypes.h"
namespace DSG {
    class SignalProcess;
    /*!\brief DSG::AudioSettings - Global Storage For Audio Settings Such As Sample Rate
     */
    class AudioSettings{
    public:
        static DSG::DSGFrequency const& SampleRate();
        static DSG::DSGFrequency const& SampleRate(DSG::DSGFrequency const& value);
        static DSG::DSGFrequency const& Nyquist();
        static bool AddSampleRateListener(SignalProcess* listener);
        static bool const& IsSampleRateSet();
    protected:
        static DSG::DSGFrequency _sampleRate;
        static DSG::DSGFrequency _nyquist;
        static std::vector<DSG::SignalProcess*> _listeners;
        static bool _set;
    };
    namespace{
#define SampleRateDefault 44100//hidden macro defining default sample rate
    }
    //!\brief DSG::SampleRate - Get Global Sample Rate
    inline DSG::DSGFrequency const& SampleRate(){
        return DSG::AudioSettings::SampleRate();
    }
    //!\brief DSG::SampleRate - Set Global Sample Rate
    inline DSG::DSGFrequency const& SampleRate(DSG::DSGFrequency const& value){
        return DSG::AudioSettings::SampleRate(value);
    }
    //!\brief DSG::Nyquist() - Pre-Calculated Nyquist Limit. Use instead of calculating each time needed. This value will be updated whenever the sample rate changes.
    inline DSG::DSGFrequency Nyquist(){
        return DSG::AudioSettings::Nyquist();
    }
    //!\brief DSG::AddSampleRateListener() - Allows Generators to be notified if the sample rate changes
    inline bool AddSampleRateListener(DSG::SignalProcess* listner){
        return AudioSettings::AddSampleRateListener(listner);
    }
    //!\brief DSG::VerifySampleRateSet() - Allows a Generator to ask if a valid sample rate has been set
    inline void VerifySampleRateSet(){
        if (!DSG::AudioSettings::IsSampleRateSet()) {
            SampleRate(SampleRateDefault);
        }
    }
}
#endif /* defined(__DSG__AudioSettings__) */

そして.cpp:

#include "AudioSettings.h"
#include "SignalProcess.h"
DSG::DSGFrequency DSG::AudioSettings::_sampleRate;
DSG::DSGFrequency DSG::AudioSettings::_nyquist;
bool DSG::AudioSettings::_set=false;
std::vector<DSG::SignalProcess*> DSG::AudioSettings::_listeners;
DSG::DSGFrequency const& DSG::AudioSettings::SampleRate(){
    return _sampleRate;
}
DSG::DSGFrequency const& DSG::AudioSettings::SampleRate(DSG::DSGFrequency const& value){
    if (!_set) {
        _set=true;
    }
    _sampleRate = value;
    _nyquist = _sampleRate*0.5;
    for (auto i:_listeners) {
        i->SampleRateChanged(_sampleRate);
    }
    return _sampleRate;
}
DSG::DSGFrequency const& DSG::AudioSettings::Nyquist(){
    return _nyquist;
}
bool DSG::AudioSettings::AddSampleRateListener(DSG::SignalProcess* listener){
    _listeners.push_back(listener);
    return true;
}
bool const& DSG::AudioSettings::IsSampleRateSet(){
    return _set;
}

上記のコードは、リンカーがシンボルを見つけることができると言っているソース ファイルです。

問題は、Xcode を使用してこのソースをコンパイルしてライブラリにリンクできるが、makefile を使用できないことです。そのため、メイクファイルを何らかの形で台無しにしてしまったのではないかと心配しています。どちらの場合もまったく同じコンパイラ、GCC 4.9.2 を使用しているため、Xcode と makefile の間でコンパイラとリンカーのコマンドが異なることが問題だと思います。

リンクするために何を変更すればよいかを知る必要がありますか? 私が提供できる情報が他にある場合は、お知らせください。ありがとう。

4

0 に答える 0