c++ - 静态库中对 c++11 原子的 undefined reference

标签 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 字节原子指令,因此您将需要使用提供原子操作作为库函数的 GCC 库。

Link with -latomic 链接到 GCC 的 libatomic

您的 makefile 试图这样做,但是您只在编译 .o 对象时使用 LFLAGS,它不做任何链接,所以 -latomic 选项在重要时不使用。

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

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

关于c++ - 静态库中对 c++11 原子的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35339514/

相关文章:

c++ - 在此范围内未声明的变量 数组线性搜索

c++ - 使用 UNREFERENCED_PARAMETER 宏

c++ - std::enable_if,模板特化和继承

multithreading - Makefile目标运行并行目标,并在完成更多工作之前等待它们完成

compilation - 使用 Gnu Make 实用程序自动创建具有与源不同的构建结构的文件

c - 在 Makefile 中找不到模式规则

c++ - 将结构转换为字节并返回结构

c++ - vector 元素的引用地址与其指向的 vector 元素具有不同的地址。为什么?

c++ - 使用 noexcept 优化 std::bitset

c++ - 在不显式指定其余参数的情况下设置默认模板非类型参数