静态库中未定义的引用到c ++ 11 atomic

时间:2016-02-11 12:35:51

标签: c++ c++11 makefile stdatomic

使用我事先在项目中创建的静态库时遇到问题。此静态库使用c++11 atomic。一切都编译得很好,我的静态库就被创建了。但是,当我尝试在另一个项目中使用它时,在链接时我收到以下错误:

 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)/* 

有没有想过这个?

1 个答案:

答案 0 :(得分:1)

您正在编译的目标平台似乎本身不支持1字节原子指令,因此您需要使用提供原子操作作为库函数的GCC库。

-latomic关联以链接到GCC的libatomic

你的makefile尝试这样做,但你只在编译LFLAGS对象时使用.o,它没有做任何链接,因此当它重要时不使用-latomic选项

在编译使用静态库的程序时,需要使用-latomic选项,而不是在创建静态库时。

makefile有点混乱。在编译对象时使用链接器标志是没用的,通常CPPFLAGS包含预处理器的标志,而不是-c-Os等编译标志。