0

C++ Boost ライブラリを使用して、Kinect から取得した深度データをシリアル ポートに書き込もうとしています。これを行うには、適切なライブラリをこの事前に作成された Makefile にリンクする必要があります。ライブラリの感触をつかむためにboost/asioを使用して基本的なプログラムを作成しました。コンパイルするには、/usr/local/libにあるboost_systemライブラリにリンクし、/usr/local/include/からヘッダーファイルをインクルードする必要がありました。ブースト。代わりに、この Makefile から同じ接続を作成する必要があるだけの OpenNI コードで使用することを考えました。

    # take this file's dir
    COMMON_CPP_MAKE_FILE_DIR = $(dir $(lastword $(MAKEFILE_LIST)))

    include $(COMMON_CPP_MAKE_FILE_DIR)CommonDefs.mak

    # define a function to figure .o file for each source file (placed under intermediate directory)
    SRC_TO_OBJ = $(addprefix ./$(INT_DIR)/,$(addsuffix .o,$(notdir $(basename $1))))

    # create a list of all object files
    OBJ_FILES = $(call SRC_TO_OBJ,$(SRC_FILES_LIST))

    # define a function to translate any source file to its dependency file (note that the way we create
    # dep files, as a side affect of compilation, always puts the files in the INT_DIR with suffix .d)
    SRC_TO_DEP = $(addprefix ./$(INT_DIR)/,$(addsuffix .d,$(notdir $(basename $1))))

    # create a list of all dependency files
    DEP_FILES = $(call SRC_TO_DEP,$(SRC_FILES_LIST))

    # older version of gcc doesn't support the '=' symbol in include dirs, so we replace it ourselves with sysroot
    INC_DIRS_FROM_SYSROOT = $(patsubst =/%,$(TARGET_SYS_ROOT)/%,$(INC_DIRS))

    # append the -I switch to each include directory
    INC_DIRS_OPTION = $(foreach dir,$(INC_DIRS_FROM_SYSROOT),-I$(dir)) -I/usr/local/include/boost

    # append the -L switch to each library directory
    LIB_DIRS_OPTION = $(foreach dir,$(LIB_DIRS),-L$(dir)) -L$(OUT_DIR) -L/usr/local/lib 

    # append the -l switch to each library used
    USED_LIBS_OPTION = $(foreach lib,$(USED_LIBS),-l$(lib)) -lboost_system

    # append the -D switch to each define
    DEFINES_OPTION = $(foreach def,$(DEFINES),-D$(def))

    # tell compiler to use the target system root
    ifdef TARGET_SYS_ROOT
        CFLAGS += --sysroot=$(TARGET_SYS_ROOT)
        LDFLAGS += --sysroot=$(TARGET_SYS_ROOT)
    endif

    # set Debug / Release flags
    ifeq "$(CFG)" "Debug"
        CFLAGS += -O0 -g
    endif
    ifeq "$(CFG)" "Release"
        CFLAGS += -O2 -DNDEBUG
    endif

    CFLAGS += $(INC_DIRS_OPTION) $(DEFINES_OPTION)
    LDFLAGS += $(LIB_DIRS_OPTION) $(USED_LIBS_OPTION)

    # some lib / exe specifics
    ifneq "$(LIB_NAME)" ""
        OUTPUT_NAME = lib$(LIB_NAME).so
        CFLAGS += -fPIC -fvisibility=hidden
        ifneq ("$(OSTYPE)","Darwin")
            LDFLAGS += -Wl,--no-undefined
            OUTPUT_NAME = lib$(LIB_NAME).so
            OUTPUT_COMMAND = $(CXX) -o $(OUTPUT_FILE) $(OBJ_FILES) $(LDFLAGS) -shared
        else
            LDFLAGS += -undefined error
            OUTPUT_NAME = lib$(LIB_NAME).dylib
            OUTPUT_COMMAND = $(CXX) -o $(OUTPUT_FILE) $(OBJ_FILES) $(LDFLAGS) -dynamiclib -headerpad_max_install_names
        endif
    endif
    ifneq "$(EXE_NAME)" ""
        OUTPUT_NAME = $(EXE_NAME)
        OUTPUT_COMMAND = $(CXX) -o $(OUTPUT_FILE) $(OBJ_FILES) $(LDFLAGS)
    endif
    ifneq "$(SLIB_NAME)" ""
        CFLAGS += -fPIC
        OUTPUT_NAME = lib$(SLIB_NAME).a
        OUTPUT_COMMAND = $(AR) -cq $(OUTPUT_FILE) $(OBJ_FILES)
    endif

    define CREATE_SRC_TARGETS
    # create a target for the object file (the CXX command creates both an .o file
    # and a .d file)
    ifneq ("$(OSTYPE)","Darwin")
    $(call SRC_TO_OBJ,$1) : $1 | $(INT_DIR)
        $(CXX) -MD -MP -MT "$(call SRC_TO_DEP,$1) $$@" -c $(CFLAGS) -o $$@ $$<
    else
    $(call SRC_TO_OBJ,$1) : $1 | $(INT_DIR)
        $(CXX) -c $(CFLAGS) -o $$@ $$<
    endif
    endef

    #############################################################################
    # Targets
    #############################################################################
    .PHONY: clean-objs clean-defs

    include $(COMMON_CPP_MAKE_FILE_DIR)CommonTargets.mak

    # create targets for each source file
    $(foreach src,$(SRC_FILES_LIST),$(eval $(call CREATE_SRC_TARGETS,$(src))))

    # include all dependency files (we don't need them the first time, so we can use -include)
    -include $(DEP_FILES)

    $(OUTPUT_FILE): $(OBJ_FILES)
        $(OUTPUT_COMMAND)

    clean-objs:
        rm -rf $(OBJ_FILES)

    clean-defs:
        rm -rf $(DEP_FILES)

    clean: clean-objs clean-defs

追加した:

-I/usr/local/include/boost 

INC_DIRS_OPTION に

-L/usr/local/lib

LIBS_DIRS_OPTION、および

-lboost_system

USED​​_LIBS_OPTION へ (asio は、ある種のエラー生成のために boost システム ライブラリに依存しています)

次のエラーが表示されます。

c++ -o ../Bin/x64-Release/Sample-NiSimpleRead ./x64-Release/NiSimpleRead.o -arch i386 -arch x86_64 -L../../Lib -L../Bin/x64-Release  -lOpenNI -lboost_system 
ld: warning: ignoring file /usr/local/lib/libboost_system.dylib, file was built for unsupported file format which is not the architecture being linked (i386)
Undefined symbols for architecture i386:
  "boost::system::generic_category()", referenced from:
      __GLOBAL__I_a in NiSimpleRead.o
  "boost::system::system_category()", referenced from:
      __GLOBAL__I_a in NiSimpleRead.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [../Bin/x64-Release/Sample-NiSimpleRead] Error 1

lib ディレクトリを DYLD_LIBRARY_PATH に追加しようとしましたが、何もしませんでした。また、最初に NiSimpleRead.o バイナリを libboost_system.a ファイルと組み合わせて使用​​して、ある種の共有 (*.so) ライブラリを作成しようとしましたが、多くのエラーが発生しました。次に、boost_system.a ファイル自体を .so に変更しようとしましたが、これも何もしませんでした。これに関するアドバイスは素晴らしいでしょう。

4

1 に答える 1

0

問題は、64ビットのBoostしかなく、ユニバーサル(32ビットと64ビットの両方)のバイナリを作成しようとしていることのようです。32ビットバージョンと64ビットバージョンの両方で依存関係をインストールするか-arch i386、ビルド手順からこれを破棄してください。

于 2012-07-02T16:17:20.713 に答える