###追加質問です
下記で質問させて頂いてましたが、新たなエラーが出てきたので
質問させて頂きます。
もともと3つの.aファイルをを共有ライブラリに静的に結びつけようとしていて
undifineのエラーが出ていました。(実行ファイルのmake時)
試しに別の.aファイルを試すとこちらは上手く静的に結びつき
undifineのエラーが出ませんでした。
同じ方法でもともとの.aファイルで実行するとエラーが出てくるので
ここの部分が問題かと思います。
新たなエラー
NPACK -shared obj/region_layer.o obj/utils.o obj/local_layer.o obj/shortcut_layer.o obj/im2col.o obj/data.o obj/batchnorm_layer.o obj/dropout_layer.o obj/image.o obj/convolutional_layer.o obj/gru_layer.o obj/detection_layer.o obj/avgpool_layer.o obj/col2im.o obj/normalization_layer.o obj/inferencer.o obj/train.o obj/lstm_layer.o obj/network.o obj/crnn_layer.o obj/layer.o obj/deconvolutional_layer.o obj/rnn_layer.o obj/reorg_layer.o obj/crop_layer.o obj/softmax_layer.o obj/box.o obj/list.o obj/matrix.o obj/connected_layer.o obj/gemm.o obj/parser.o obj/option_list.o obj/activations.o obj/cuda.o obj/blas.o obj/activation_layer.o obj/maxpool_layer.o obj/route_layer.o obj/tree.o obj/cost_layer.o /opt/openblas/lib/libopenblas.a /home/NNPACK/lib/libpthreadpool.a -o libsensor.so /usr/bin/ld: /home/NNPACK/lib/libpthreadpool.a(threadpool-pthreads.c.o): relocation R_X86_64_32 against `.text' can not be used when making a shared object; recompile with -fPIC /home/NNPACK/lib/libpthreadpool.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status Makefile:93: recipe for target 'libtest.so' failed make: *** [libsensor.so] Error 1
sharedの引数に2つの.aファイルを追加しています。
libopenblas.a(新たに試した.a)
libpthreadpool.a(もともとの.a)
###追加の質問
このエラーについて-fPICを追加する必要があるように思ったのですが、
すでに付いている認識でいます。どこを変更すれば宜しいでしょうか?
もしくは.aファイル作成時(cmake)に必要なのでしょうか。
つまり.aファイルを作り直す?
よろしくお願いします。
makeファイル変更点
・ifeq ($(OPENBLAS), 1)部分追加
・$(DLIB)の引数にlibopenblas.a、libpthreadpool.aを追加
(省略) ifeq ($(OPENBLAS), 1) INCLUDE+= -static -DOPENBLAS -I/opt/openblas/include CFLAGS+= -DOPENBLAS -DSTBI_NO_HDR -DSTBI_NO_LINEAR LDFLAGS+=/opt/openblas/lib/libopenblas.a endif ifeq ($(NNPACK), 1) INCLUDE+= -static -DNNPACK -I/home/NNPACK/deps/pthreadpool/include -I/home/NNPACK/include/nnpack -I/home/NNPACK/deps/cpuinfo/include CFLAGS+= -DNNPACK LDFLAGS+= /home/NNPACK/lib/libpthreadpool.a /home/NNPACK/lib/libnnpack.a /home/NNPACK/lib/libcpuinfo.a endif (省略) all: $(TARGET) $(DLIB) $(TARGET): $(OBJECTS) $(COMPILER) $(CFLAGS) $(LIBS) -o $@ $^ $(LDFLAGS) $(DLIB): $(OBJECTS) /opt/openblas/lib/libopenblas.a /home/NNPACK/lib/libpthreadpool.a $(COMPILER) $(CFLAGS) -shared $^ -o $@ (省略)
###ここから下は当初の内容です
前提・実現したいこと
makeファイルを用いてc++のコンパイルがしたいです。
経緯
makeファイル(soファイル作成用makeファイル)を用いてlibtest.soファイルを作成しました。
このファイルは外用(他人に渡す用)のため、
全てのライブラリを含んだ上で渡したいです。
確認のため、自分用にこのlibtest.soファイルとmain.cppファイルを用いて実行ファイルを作るためにコンパイル(実行ファイル作成用makeファイル)しようとすると下記のエラーが発生します。
発生している問題・エラーメッセージ
g++ -std=gnu++14 -Ofast -fPIC -fopenmp -o main obj/main.o -lm -lpthread -lgomp ../../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:30: recipe for target 'main' failed make: *** [main] Error 1
試しに、この実行ファイル用makeファイルにエラーでundifineとされている
関数が組み込まれた.aファイルをLDFLAGSに指定すると問題なく実行ファイルが作成されました。
LDFLAGS+= /home/NNPACK/lib/libnnpack.a /home/NNPACK/lib/libpthreadpool.a /home/NNPACK/lib/libcpuinfo.a
これらの.aファイルはsoファイル用makeファイルにも
同じようにパスを指定していたので、問題ないかと思っていました。
調べてみると、これらの.aファイルを用いてsoファイルを作成する際、
上手く静的に結びついていないのが原因かと思っています。
(そのためundifineになるのかと思っています)
静的リンクにするためso用makeファイルを書き換えましたが、
上手くいかず同じエラーが出続けています。
so用makeファイルはどのように記載すれば、
静的リンクとしてsoファイルに結びつくのでしょうか?
何か勘違いがございましたら、ご指摘のほど宜しく尾根がします。
該当のソースコード
soファイル作成用makeファイル
NNPACK=1 COMPILER = g++ CFLAGS :=-std=gnu++14 -Ofast -fPIC -fopenmp -g CUFLAGS:=-Wall -Wno-unknown-pragmas -Wfatal-errors -Ofast -fPIC -fopenmp LDFLAGS := -lm -lpthread -lgomp -static-libstdc++ -static-libgcc INCLUDE = -I./include -I/usr/include ifeq ($(NNPACK), 1) INCLUDE+= -static -DNNPACK -I/home/spot1/NNPACK/include CFLAGS+= -DNNPACK LDFLAGS+= /home/NNPACK/lib/libnnpack.a /home/NNPACK/lib/libpthreadpool.a /home/NNPACK/lib/libcpuinfo.a endif TARGET = ./sensor DLIB = ./libtest.so SRCDIR = ./source ifeq "$(strip $(SRCDIR))" "" SRCDIR = . endif SOURCES = $(wildcard $(SRCDIR)/*.cpp) OBJDIR = ./obj ifeq "$(strip $(OBJDIR))" "" OBJDIR = . endif OBJECTS = $(addprefix $(OBJDIR)/, $(notdir $(SOURCES:.cpp=.o))) ifeq ($(GPU), 1) CU_SOURCES = $(wildcard $(SRCDIR)/*.cu) OBJECTS += $(addprefix $(OBJDIR)/, $(notdir $(CU_SOURCES:.cu=.o))) endif DEPENDS = $(OBJECTS:.o=.d) all: $(TARGET) $(DLIB) $(TARGET): $(OBJECTS) $(COMPILER) $(CFLAGS) $(LIBS) -o $@ $^ $(LDFLAGS) $(DLIB): $(OBJECTS) $(COMPILER) $(CFLAGS) -shared $^ -o $@ $(OBJDIR)/%.o: $(SRCDIR)/%.cpp -mkdir -p $(OBJDIR) $(COMPILER) $(CFLAGS) $(INCLUDE) $(LIBS) -o $@ -c $< $(OBJDIR)/%.o: $(SRCDIR)/%.cu $(NVCC) -std=c++14 $(ARCH) $(INCLUDE) --compiler-options "$(CUFLAGS)" -c $< -o $@ clean: -rm -f $(OBJECTS) $(DEPENDS) $(TARGET) -include $(DEPENDS)
実行ファイル作成用makeファイル
このmakeファイル実行時に問題のエラーが発生しています。
LDFLAGSの./libtest.so後に下記を追加すれば問題なくコンパイルはできるのですが、
外用のため、このmakeファイルでは呼出し不要にしたいです。
home/NNPACK/lib/libnnpack.a /home/NNPACK/lib/libpthreadpool.a /home/NNPACK/lib/libcpuinfo.a
COMPILER = g++ CFLAGS :=-std=gnu++14 -Ofast -fPIC -fopenmp LDFLAGS := -lm -lpthread -lgomp ../../libtest.so INCLUDE = `pkg-config --cflags opencv` -I./ -I/usr/include #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 $< clean: -rm -f $(OBJECTS) $(DEPENDS) $(TARGET) -include $(DEPENDS)
補足情報(FW/ツールのバージョンなど)
gcc 5.4.0
ubuntu16.4
C++
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/11 05:56
2018/07/11 06:16
2018/07/11 07:38
2018/07/11 07:39
2018/07/11 08:12
2018/07/11 08:19
2018/07/11 08:24
2018/07/11 08:36
2018/07/11 12:05
2018/07/11 13:37
2018/07/12 01:16
2018/07/13 07:55