2013-03-29 4 views
6

외부 라이브러리 (wierd 프로세스, mpicc + Cython + 등), 을 연결하고 있지만 연결 절차가 이상합니다.이상한 연결 동작 및 정의되지 않은 기호

그들이 .so를 파일로 연결되는 두 개의 .o 인 파일, libpetsc4py.o 및 PETSc.o 이있다는 PETSc.so는

하나가 정의 __pyx_tp_new_8petsc4py_5PETSc_Object

[[email protected] src]$ nm libpetsc4py.o | grep __pyx_tp_new_8petsc4py_5PETSc_Object 
         U __pyx_tp_new_8petsc4py_5PETSc_Object 

정의되지 않은 기호를 포함 다른 .o 인 파일 : 다음

[[email protected] src]$ nm PETSc.o | grep __pyx_tp_new_8petsc4py_5PETSc_Object 
00000000001b92f0 t __pyx_tp_new_8petsc4py_5PETSc_Object 

후 이루어집니다 연결 (컴파일 라인은 이상한 죄송)

mpicc -pthread -fPIC -wd1572 -g -shared -fno-strict-aliasing -g -O2 -DNDEBUG -O2 -g 
build/temp.linux-x86_64-2.7/arch-linux2-c-debug/src/PETSc.o build/temp.linux-x86_64- 
2.7/arch- linux2-c-debug/src/libpetsc4py.o -L/home/users/zheltkov/tmp/petsc-3.3/arch 
-linux2-c-debug/lib -L/home/users/zheltkov/ivan/soft/epd7.2/lib 
-Wl,rpath,/home/users/zheltkov/tmp/petsc-3.3/arch-linux2-c-debug/lib 
-Wl,-rpath,/home/users/zheltkov/ivan/soft/epd7.2/lib -lpetsc -lpython2.7 -o 
build/lib.linux-x86_64-2.7/petsc4py/lib/a rch-linux2-c-debug/PETSc.so -lX11 -Wl, 
-rpath,/home/users/zheltkov/tmp/petsc-3.3/arch-linux2-c-debug/lib 
-L/home/users/zheltkov/tmp/petsc-3.3/arch-linux2-c-debug/lib -lfftw3_mpi -lfftw3 -lHYPRE 
-Wl,-rpath,/opt/intel/impi/4.1.0.030/intel64/lib 
-L/opt/intel/impi/4.1.0.030/intel64/lib -Wl, 
-rpath,/opt/intel/composer_xe_2013.2.146/mkl/lib/intel64 
-L/opt/intel/composer_xe_2013.2.146/mkl/lib/intel64 
-Wl,-rpath,/opt/intel/composer_xe_2013.2.146/compiler/lib/intel64 
-L/opt/intel/composer_xe_2013.2.146/compiler/lib/intel64 -Wl, 
-rpath,/usr/lib/gcc/x86_64-redhat-linux/4.4.6 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.6 
-Wl,- rpath,/mnt/data/users/dm4/vol9/zheltkov/tmp/petsc-3.3/-Xlinker -lmpigc4 
-Wl,-rpath,/opt/intel/mpi-rt/4.1 -lml -lpthread -Wl,-rpath, 
/opt/intel/composer_xe_2013/mkl/lib/intel64 
-L/opt/intel/composer_xe_2013/mkl/lib/intel64 -lmkl_intel_lp64 -lmkl_intel_thread 
-lmkl_core -liomp5 -lifport -lifcore -lm -ldl -lmpigf -lmpi_dbg -lmpigi -lrt 
-limf -lsvml -lirng -lipgo -ldecimal -lcilkrts -lstdc++  -lgcc_s -lirc -lirc_s 

그러나 마지막으로, 결과 파일은 같은 이름, 그 중 하나가 정의되지 않은 모든 것이 작동하지 않는 두 개의 기호를 가지고 내가 잘못

[[email protected] arch-linux2-c-debug]$ nm PETSc.so | grep __pyx_tp_new_8petsc4py_5PETSc_Object 
0000000000200d20 t __pyx_tp_new_8petsc4py_5PETSc_Object 
       U __pyx_tp_new_8petsc4py_5PETSc_Object 

를하고있는 중이 야 무엇을? 같은 이름의 심볼이 두 개있는 이유는 무엇입니까?

답변

7

오브젝트 파일에서 t은 함수가 내부 연결 (즉, static으로 선언 됨)을 나타내고 다른 파일에서는 U이 함수가 참조되지만 정의되지 않았 음을 나타냅니다. 외부 기능은 T으로 표시됩니다.

공유 라이브러리를 만들기 위해 링크 할 때 링커는 해결되지 않은 참조에 대해 불평하지 않기 때문에 정의 된 파일에만 사용할 수있는 정적 함수와 정의되지 않은 것으로 표시된 외부 심볼을 ​​포함합니다.

다음은 더 간단한 예입니다. 두 파일 :

void sayhello(void) 
{ 
    hello(); 
} 

가 컴파일

foo.c를

#include <stdio.h> 

static void hello(void) 
{ 
    printf("Hello\n"); 
} 

bar.c 두 :

$ gcc -c -fPIC foo.c 
$ gcc -c -fPIC bar.c 
$ nm foo.o 
0000000000000000 t hello 
$ nm bar.o 
       U hello 
0000000000000000 T sayhello 

지금 공유 라이브러리를 생성

$ gcc -shared -o libhello.so foo.o bar.o 
$ nm libhello.so 
0000000000000700 t hello 
       U hello 

이 결과는 hello 함수를 정의하고이 라이브러리와 링크하여 실행 파일을 만들면 라이브러리가 정적 함수가 아닌 sayhello에서 내 함수를 호출한다는 것입니다. 정의하지 않으면 링커에서 정의되지 않은 기호 오류가 발생합니다.

+0

외부 기호가 유형으로 'T'대신 'T'를 사용한다는 점은 주목할 가치가 있습니다. – shakurov

+0

@shakurov - 추가되었습니다. – teppic