Моя проблема довольно проста, но я просто не знаю, как ее решить. Я знаю, как скомпилировать и создать библиотеку, и ссылаться на нее, если я не использую make-файл, потому что тогда я могу просто вызывать ar отдельно и все идет правильно.
В любом случае я использую библиотеку petsc и использую make-файл, который они предоставили:
CFLAGS =
FFLAGS =
CPPFLAGS =
FPPFLAGS =
LOCDIR = /home/user/.../.../ # Working folder
EXAMPLESC = main.cpp class.cpp #.cpp file names here
EXAMPLESF =
#MANSEC = Mat I don't know what this is but it seems to work without it.
include ${PETSC_DIR}/conf/variables
include ${PETSC_DIR}/conf/rules
myProgram: main.o class.o chkopts
-${CLINKER} -o myProgram main.o class.o ${PETSC_MAT_LIB}
${RM} main.o class.o
include ${PETSC_DIR}/conf/test
ARFLAGS будет иметь значение -rv по умолчанию, поэтому где я должен предоставить такую информацию, как
ar -rv libclassdll.a class.o
и куда мне добавить -L./-lclassdll?
Я довольно новичок с make-файлами, поэтому я немного растерялся: <</p>
Я пытался изменить строку на
myProgram: main.o class.o chkopts
-${CLINKER} -o myProgram main.o class.o ${AR} libclassdll.a class.o ${PETSC_MAT_LIB}
${RM} main.o class.o
и моя команда компиляции выглядит так:
mpicxx -o myProgram main.o class.o / usr / bin / ar / libclassdll.a class.o -L (здесь много ссылок) и, по крайней мере, там написано: g ++ classdll.a такого файла или директории нет.
Так что он не генерирует даже файл lib для меня. Так что любые идеи будут по достоинству оценены.
Новая проблема, когда я загрузил make-файл на другой компьютер, мой текущий make-файл выглядит так
LibMyClass.so: MyClass.o chkopts
-${CLINKER} -shared -Wl,-soname,${SONAME} -o ${VERS} *.o ${PETSC_MAT_LIB}
mv ${VERS} ${LIBADD}
ln -sf ${LIBADD}${VERS} ${LIBADD}${SOWOV}
ln -sf ${LIBADD}${VERS} ${LIBADD}${SONAME}
Это работает на одной машине, но другая машина выдает следующую ошибку
/usr/bin/ld: MyClass.o: relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
MyClass.o: could not read symbols: Bad value
Конечно, я изменил пути, но, думаю, это указывает на другие проблемы, потому что даже если я наберу "g ++ -shared -Wl, -soname, libmyclass.so.1 -o libmyclass.so.1.0 MyClass.o" или "g ++ -fPIC -share ..." я получу ту же ошибку.