Я создаю пакет R myCode
из многопоточного пакета C ++ под названием myCode
, (Как вы можете видеть из Makevars ниже, требуется соединение с двумя существующими библиотеками C ++, library1
а также library2
.)
Используя скелет Rcpp, я добавил весь код C ++ в /src
и создал этот файл Makevars для вывода общей библиотеки myCode.so
в результате чего я включил флаги -fPIC
а также -shared
:
LIBRARY1_DIR := ./library1/
LIBRARY2_DIR := ./library2/
ABS_LIBRARY1_DIR := $(realpath $(LIBRARY1_DIR))
ABS_LIBRARY2_DIR := $(realpath $(LIBRARY2_DIR))
CXX := g++
CXXFLAGS := -Wno-deprecated -Wall -O3 -fexceptions -g -Wl,-rpath,$(ABS_LIBRARY1_DIR)/lib/
LDLIBS := -I$(ABS_LIBRARY1_DIR)/include/ -I$(ABS_LIBRARY2_DIR)/ -L$(ABS_LIBRARY1_DIR)/lib/ -L$(ABS_LIBRARY2_DIR)/
all: library1 library2 myCode
.PHONY : myCode
myCode: file1.cpp file2.cpp file3.hh file3.cpp file4.hh file4.cpp file5.cpp file5.hh file6.hh file6.hh file7.cpp file7.hh
$(CXX) $(CXXFLAGS) $(INCLUDES) file1.cpp file2.cpp -o myCode.so $(ABS_LIBRARY2_DIR)/importfile1.a -lz -ldl -llibrary1 -lpthread -fPIC -shared.PHONY : library1
library1:
mkdir $(ABS_LIBRARY1_DIR)/build; cd $(ABS_LIBRARY1_DIR)/build; cmake ..; make; cd ../
.PHONY : library2
library2:
cd $(ABS_LIBRARY2_DIR); ./configure; make; cd ../
#.PHONY : clean
clean:
rm myCode.so; rm -rf $(ABS_LIBRARY1_DIR)/build; rm -rf $(ABS_LIBRARY1_DIR)/include; rm -rf $(ABS_LIBRARY1_DIR)/lib; rm -rf $(ABS_LIBRARY1_DIR)/bin; cd $(ABS_LIBRARY2_DIR); make clean;
Это, кажется, правильно компилируется при library(devtools)
а также install_github("handle/myCode")
… пока он не начнет выводить эти строки, которые бросают несколько 'linker' input unused [-Wunused-command-line-argument]
Предупреждения пока не сломается:
clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include" -std=c++11 -Wno-deprecated -Wall -O3 -fexceptions -g -Wl,-rpath,/private/var/folders/1d/_h9qdvds6l5d7x78b21pn1_45n_16x/T/RtmpabyubP/devtools56576bf4fa65/username-myCode-368aaf6/src/library1/lib/ -fPIC -Wall -mtune=core2 -g -O2 -c file2.cpp -o file2.o
clang: warning: -Wl,-rpath,/private/var/folders/1d/_h9qdvds6l5d7x78b21pn1_45n_16x/T/RtmpabyubP/devtools56576bf4fa65/username-myCode-368aaf6/src/library/lib/: 'linker' input unused [-Wunused-command-line-argument]
clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include" -std=c++11 -Wno-deprecated -Wall -O3 -fexceptions -g -Wl,-rpath,/private/var/folders/1d/_h9qdvds6l5d7x78b21pn1_45n_16x/T/RtmpabyubP/devtools56576bf4fa65/username-myCode-368aaf6/src/library1/lib/ -fPIC -Wall -mtune=core2 -g -O2 -c file3.cpp -o file3.o
clang: warning: -Wl,-rpath,/private/var/folders/1d/_h9qdvds6l5d7x78b21pn1_45n_16x/T/RtmpabyubP/devtools56576bf4fa65/username-myCode-368aaf6/src/library1/lib/: 'linker' input unused [-Wunused-command-line-argument]
clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include" -std=c++11 -Wno-deprecated -Wall -O3 -fexceptions -g -Wl,-rpath,/private/var/folders/1d/_h9qdvds6l5d7x78b21pn1_45n_16x/T/RtmpabyubP/devtools56576bf4fa65/username-myCode-368aaf6/src/library1/lib/ -fPIC -Wall -mtune=core2 -g -O2 -c file4.cpp -o file4.o
clang: warning: -Wl,-rpath,/private/var/folders/1d/_h9qdvds6l5d7x78b21pn1_45n_16x/T/RtmpabyubP/devtools56576bf4fa65/username-myCode-368aaf6/src/library1/lib/: 'linker' input unused [-Wunused-command-line-argument]
clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include" -std=c++11 -Wno-deprecated -Wall -O3 -fexceptions -g -Wl,-rpath,/private/var/folders/1d/_h9qdvds6l5d7x78b21pn1_45n_16x/T/RtmpabyubP/devtools56576bf4fa65/username-myCode-368aaf6/src/library1/lib/ -fPIC -Wall -mtune=core2 -g -O2 -c file5.cpp -o file5.o
clang: warning: -Wl,-rpath,/private/var/folders/1d/_h9qdvds6l5d7x78b21pn1_45n_16x/T/RtmpabyubP/devtools56576bf4fa65/username-myCode-368aaf6/src/library1/lib/: 'linker' input unused [-Wunused-command-line-argument]
In file included from file6.cpp:1:
In file included from ./file6.hh:27:
./file7.hh:43:10: fatal error: 'lib/library1_header.h' file not found
#include "lib/library1_header.h"^~~~~~~~~~~~~~~~~
1 error generated.
make: *** [file6.o] Error 1
Появляется причина 'linker' input unused [-Wunused-command-line-argument]
выбрасывается из-за -c
, Опция -c
означает «только компилировать, но не ссылаться», поэтому любые связанные с компоновщиком аргументы командной строки игнорируются. Код появился для правильной компиляции до этих строк.
В качестве независимого теста, чтобы проверить выше Makevars
работает, он создает общий объект myCode.so
если я переименую выше Makefile
и беги make
, Это работает правильно, и dyn.load("myCode.so")
работает в Р.
Почему clang++ -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG
запустить при установке пакета R? Могу ли я отключить -c
флаги, или мне переписать макевары?
Задача ещё не решена.
Других решений пока нет …