4

私の問題はかなり簡単ですが、それを解決する方法がわかりません。makeファイルを使用していない場合は、コンパイルとライブラリを作成してリンクする方法を知っています。これは、arを個別に呼び出すだけで、すべてが正常に行われるためです。

とにかく、私はpetscライブラリを使用しており、それらが提供するmakefileを使用しています。

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はどこに追加すればよいですか?

私はmakefilesの新人なので、ここで少し迷っています:<

行をに変更しようとしました

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ファイルさえ生成しません。だからどんなアイデアも本当にありがたいです。

別のマシンにmakefileをアップロードしたときの新しい問題、現在のmakefileは次のようになります

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}

これは1台のマシンで機能しますが、他のマシンでは次のエラーが発生します

/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 -olibmyclass.so.1.0MyClass.o」または「g++」と入力しても、他の種類の問題を示していると思います。 -fPIC -share..."同じエラーが発生します。

4

2 に答える 2

6

理想的には、最初にライブラリを構築してから、「手動で」行うのと同じように使用する必要があります。

ライブラリを構築 (または更新) するには、次のようなルールが必要です。

libclassdll.a: class.o
    ar -rv libclassdll.a class.o

またはもっと簡潔に言うと、次のようになります。

libclassdll.a: class.o
    ar $(ARFLAGS) $@ $^

次に、ルールは次のようにmyProgramなります。

# Assuming CLINKER is something civilized, like gcc
myProgram: main.o libclassdll.a  chkopts
    -${CLINKER} -o myProgram main.o -L. -lclassdll ${PETSC_MAT_LIB}

またはそれ以上:

myProgram: main.o libclassdll.a  chkopts
    -${CLINKER} -o $@ $< -L. -lclassdll ${PETSC_MAT_LIB}

したがって、メイクファイルでは、置き換えます

myProgram: main.o class.o  chkopts
    -${CLINKER}  -o myProgram main.o class.o ${PETSC_MAT_LIB}
    ${RM} main.o class.o

myProgram: main.o libclassdll.a  chkopts
    -${CLINKER} -o $@ $< -L. -lclassdll ${PETSC_MAT_LIB}

libclassdll.a: class.o
    ar $(ARFLAGS) $@ $^

他にも微調整を加えることができますが、今のところはこれで十分です。

于 2012-03-06T23:35:48.633 に答える
3

myProgram を main.o と libclass.a に依存させます (libclassdll.a と呼ばないでください。これは DLL ではなく静的ライブラリです)。

ソリューションの一般的な要点:

# $@ means "the target of the rule"
# $^ means "the prerequisites: main.o and libclass.a"

myProgram: main.o libclass.a
        $(CC) -o $@ $^ # additional arguments for other libraries, not built in this make

libclass.a: class.o
        # your $(AR) command goes here to make the library
于 2012-03-06T23:26:00.357 に答える