Моя проблема довольно проста, но я просто не знаю, как ее решить. Я знаю, как скомпилировать, создать библиотеку и связать с ней, если я не использую 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-файлов, поэтому я немного заблудился здесь :‹
Я попытался изменить строку на
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..." Я получу ту же ошибку.
ar
и скомпилировалиmain.o
, какую команду вы бы использовали, чтобы связать их вместе и собратьmyProgram
? - person Beta   schedule 07.03.2012