4

プロジェクトで事前に作成したスタティック ライブラリを使用すると問題が発生します。このスタティック ライブラリは、c++11 アトミックを使用します。すべてがうまくコンパイルされ、静的ライブラリが作成されます。ただし、別のプロジェクトで使用しようとすると、リンク時に次のエラーが発生しました。

 src/engine/bin/libengine.a(Compound.cpp.o): In function`Job::restart()':
 (.text._ZN3Job7restartEv[_ZN3Job7restartEv]+0x30): undefined reference to `__atomic_exchange_1'

Compound.cpp.o は、ライブラリのオブジェクト ファイルの場合です。ライブラリを作成するために使用している Makefile は次のとおりです。

CC=k1-g++
CPPFLAGS=-c -I$(GENERIC_INCLUDE_DIR) -I$(SPECIFIC_INCLUDE_DIR) -Os -std=c++11 -mos=nodeos 
CXXFLAGS=-c -I$(GENERIC_INCLUDE_DIR) -I$(SPECIFIC_INCLUDE_DIR) -Os -std=c++11 -mos=nodeos 
LFLAGS=-pthread -lnodeos -latomic 

GENERIC_INCLUDE_DIR=generic/include
SPECIFIC_INCLUDE_DIR=specific/include
GENERIC_SRC_DIR=generic/src
SPECIFIC_SRC_DIR=specific/src


LIB = libengine.a
BIN_DIR=bin

vpath %.cpp $(GENERIC_SRC_DIR) $(SPECIFIC_SRC_DIR)
SOURCES := $(wildcard $(GENERIC_SRC_DIR)/*.cpp $(SPECIFIC_SRC_DIR)/*.cpp)
SOURCES := $(notdir $(SOURCES))
OBJECTS := $(patsubst %.cpp,$(BIN_DIR)/%.cpp.o,$(SOURCES))



all: $(OBJECTS) $(LIB)

$(LIB): $(OBJECTS)
    ar -cr $(BIN_DIR)/$@ $^

#$(BIN_DIR)/%.cpp.o: $(GENERIC_SRC_DIR)/%.cpp
#   $(CC) $(CPPFLAGS) $< $(LFLAGS) -o $@

$(BIN_DIR)/%.cpp.o: %.cpp
    $(CC) $(CPPFLAGS) $< $(LFLAGS) -o $@




.PHONY: clean

clean:
    rm -f $(BIN_DIR)/* 

これについて何か考えはありますか?

4

1 に答える 1

4

コンパイル対象のターゲット プラットフォームは 1 バイトのアトミック命令をネイティブにサポートしていないようです。そのため、アトミック操作をライブラリ関数として提供する GCC ライブラリを使用する必要があります。

Link with で-latomicGCC にリンクlibatomic

あなたのメイクファイルはそれをしようとしますが、リンクを行わないオブジェクトをLFLAGSコンパイルするときにのみ使用するため、オプションは重要なときに使用されません。.o-latomic

このオプションは、スタティック ライブラリを作成するときではなく、スタティック ライブラリを使用-latomicするプログラムをコンパイルするときに使用する必要があります。

makefile は少し混乱しています。オブジェクトをコンパイルするときにリンカ フラグを使用するのは無意味であり、慣習的に、やCPPFLAGSなどのコンパイル フラグではなく、プリプロセッサのフラグが含まれています。-c-Os

于 2016-02-11T13:06:14.820 に答える