前提・実現したいこと
C++でmakeファイルを用いてコンパイルをしようとしていますが、
エラーとなります。
libtest.soファイルをmake(1度目)でコンパイルしたのち、
main.cppを用いて2度目のmakeでコンパイルをしようとしています。
*当然ですが1度目と2度めのmakeファイルは別物です
ここで1度目のmakeはコンパイルが成功して
libtest.soを作成していますが、
2度目のmakeで下記の通りibtest.soにundefinedのものがあると
なっています。
3つがundefinedとなっておりますが、
sourceディレクトリ内(.cpp)のファイルには定義があり、
includeディレクトリ内(.h)にもpthreadpool_compute_1d'を含む関数の定義はありますが、
pthreadpool_compute_1d'自体の定義はありませんでした。
ここが問題でしょうか?それとも別の部分のパス指定などが怪しいでしょうか。
ここが問題の場合、具体的にどのように記載すべきか教えて頂ければと思います。
定義を試してみましたが、上手くいっていません。
ちなみに一度目のmakeファイルを修正して解決したいです。
発生している問題・エラーメッセージ
2度目のmakeファイル実行時
g++ -std=gnu++14 -Ofast -fPIC -fopenmp -o main obj/main.o ./libtest.so ./libtest.so: undefined reference to `pthreadpool_compute_1d' ./libtest.so: undefined reference to `nnp_convolution_inference' ./libtest.so: undefined reference to `pthreadpool_compute_2d' collect2: error: ld returned 1 exit status Makefile:27: recipe for target 'main' failed make: *** [main] Error 1
該当のソースコード
1度目のmakeファイル
c++
1NNPACK=1 2 3COMPILER = g++ 4CFLAGS :=-std=gnu++14 -Ofast -fPIC -fopenmp -g 5CUFLAGS:=-Wall -Wno-unknown-pragmas -Wfatal-errors -Ofast -fPIC -fopenmp 6LDFLAGS := -lm -lpthread -lgomp -static-libstdc++ -static-libgcc 7 8INCLUDE = -I./include -I/usr/include 9 10ifeq ($(NNPACK), 1) 11CFLAGS+= -DNNPACK 12LDFLAGS+= /home/NNPACK/lib/libnnpack.a /home/NNPACK/lib/libpthreadpool.a /home/NNPACK/lib/libcpuinfo.a 13endif 14 15TARGET = ./test 16DLIB = ./libtest.so 17SRCDIR = ./source 18ifeq "$(strip $(SRCDIR))" "" 19 SRCDIR = . 20endif 21SOURCES = $(wildcard $(SRCDIR)/*.cpp) 22OBJDIR = ./obj 23ifeq "$(strip $(OBJDIR))" "" 24 OBJDIR = . 25endif 26OBJECTS = $(addprefix $(OBJDIR)/, $(notdir $(SOURCES:.cpp=.o))) 27DEPENDS = $(OBJECTS:.o=.d) 28 29all: $(TARGET) $(DLIB) 30 31$(TARGET): $(OBJECTS) 32 $(COMPILER) $(CFLAGS) $(LIBS) -o $@ $^ $(LDFLAGS) 33 34$(DLIB): $(OBJECTS) 35 $(COMPILER) $(CFLAGS) -shared $^ -o $@ 36 37$(OBJDIR)/%.o: $(SRCDIR)/%.cpp 38 -mkdir -p $(OBJDIR) 39 $(COMPILER) $(CFLAGS) $(INCLUDE) $(LIBS) -o $@ -c $< 40 41$(OBJDIR)/%.o: $(SRCDIR)/%.cu 42 $(NVCC) -std=c++14 $(ARCH) $(INCLUDE) --compiler-options "$(CUFLAGS)" -c $< -o $@ 43 44# all: clean $(TARGET) 45clean: 46 -rm -f $(OBJECTS) $(DEPENDS) $(TARGET) 47-include $(DEPENDS)
sourceディレクトリ内の該当undifined
3つありますが、似通っているため
1つ目のundifinedである
「pthreadpool_compute_1d」
のコード部分を記載します。
sourceディレクトリ内
test1.cpp
void activate_array_thread(float *x, const int c, const int n, const ACTIVATION a, pthreadpool_t threadpool) { struct activate_params params = { x, n, a }; pthreadpool_compute_1d(threadpool, (pthreadpool_function_1d_t)activate_array_compute, ¶ms, c);
includeディレクトリ内
test1.h
#ifdef NNPACK void activate_array_thread(float *x, const int c, const int n, const ACTIVATION a, pthreadpool_t threadpool); #endif
#追加
2度目のmakeファイル
コード内のLDFLAGSではコンパイルが上手くいきますが、
LDFLAGS := -lm -lgomp ./libtest.so
↑このような形でコンパイルを成功させたいです。
COMPILER = g++ CFLAGS :=-std=gnu++14 -Ofast -fPIC -fopenmp LDFLAGS := -lm -lgomp ./libtest.so /home/NNPACK/lib/libnnpack.a /home/NNPACK/lib/libpthreadpool.a /home/NNPACK/lib/libcpuinfo.a LIBS = INCLUDE = -I./ -I/usr/include TARGET = ./main SRCDIR = ifeq "$(strip $(SRCDIR))" "" SRCDIR = . endif SOURCES = $(wildcard $(SRCDIR)/*.cpp) OBJDIR = ./obj ifeq "$(strip $(OBJDIR))" "" OBJDIR = . endif OBJECTS = $(addprefix $(OBJDIR)/, $(notdir $(SOURCES:.cpp=.o))) DEPENDS = $(OBJECTS:.o=.d) all: $(TARGET) $(TARGET): $(OBJECTS) $(COMPILER) $(CFLAGS) $(LIBS) -o $@ $^ $(LDFLAGS) $(OBJDIR)/%.o: $(SRCDIR)/%.cpp -mkdir -p $(OBJDIR) $(COMPILER) $(CFLAGS) $(INCLUDE) $(LIBS) -o $@ -c $< # all: clean $(TARGET)
補足情報(FW/ツールのバージョンなど)
c++
ubuntu16.4
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/10 09:16