2016-10-14 5 views
1

나는 C로 쓴 라이브러리를 가지고 있으며 파이썬에서 액세스해야하므로 Boost.Python을 사용하여 포장했습니다. 나는 아무런 문제 .so 파일 부스트로 내 라이브러리를 컴파일 할 수 있지만, 나는 (import tropmodboost 포함) 파이썬에로드 할 때, 나는 다음과 같은 오류 얻을 :Boost.Python 모듈을로드 할 수 없습니다 - 정의되지 않은 기호

나는 밖으로 found
ImportError: ./tropmodboost.so: undefined symbol: _Z12simplex_freeP7simplex 

이가 common 있음을 오류가 있으며, 종종 g ++ 링커 호출에서 -l 지시어를 재정렬해야 할 수도 있지만, 내가 말할 수있는 한 이미 괜찮습니다. 부스트 래퍼 코드 자체

linux-vdso.so.1 => (0x00007ffff79a3000) 
libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007f34ea732000) 
libboost_python-py27.so.1.58.0 => /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.58.0 (0x00007f34ea4e6000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f34ea163000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f34e9f4d000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f34e9b84000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f34e9966000) 
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f34e974c000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f34e9548000) 
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f34e9344000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f34e903b000) 
/lib64/ld-linux-x86-64.so.2 (0x0000561fcfee3000) 

여기 .HPP 파일에서 제외하고있어 보여줍니다 :

# location of the Python header files 
PYTHON_VERSION = 2.7 
PY_VER2  = 27 

# various include directories, used separately in different compiler tasks 
PYN_INC = /usr/include/python$(PYTHON_VERSION) 
IGH_INC = /usr/local/include/igraph 
BST_INC = /usr/include 

# library locations for linking 
LS = -L/usr/lib/x86_64-linux-gnu -L/usr/local/lib -L/usr/lib/python$(PYTHON_VERSION)/config 
lS = -lboost_python-py$(PY_VER2) -lpython$(PYTHON_VERSION) 

# source files for different compiler tasks 
CORE_SRC = permutation_src.c permutation_parity.c split.c simplex.c simplex_src.c build_complex.c 
TEST_SRC = main.c tests/tests.c -ligraph -lm 

# objects for linking the core to the boost module 
CORE_OBJS = permutation_src.o permutation_parity.o split.o simplex.o simplex_src.o build_complex.o 

.PHONY: clean tests 

main: tropmod.boost.o 
    g++ -shared -Wl,--export-dynamic tropmod.boost.o $(LS) $(lS) $(CORE_OBJS) -o tropmodboost.so 

tropmod.boost.o: tropmod.boost.cpp tmstuff 
    g++ -I$(PYN_INC) -I$(BST_INC) -I$(IGH_INC) -fPIC -c tropmod.boost.cpp 

tmstuff: main.c permutation_src.c permutation_parity.c split.c simplex.c simplex_src.c tests/tests.c 
    gcc -I. -I=$(IGH_INC) -fPIC -c $(CORE_SRC) 

debug: main.c permutation_src.c permutation_parity.c split.c simplex.c simplex_src.c tests/tests.c 
    gcc -I. -I=$(IGH_INC) -g -fPIC -c $(CORE_SRC) 

tests: 
    gcc -I. -I=$(IGH_INC) -g -o tmtest $(CORE_SRC) $(TEST_SRC) -L/usr/local/lib -ligraph -lm 

clean: 
    rm *.o *.so 

ldd tropmodboost.so 출력을 호출 : 여기

우분투에서 실행되는 내 메이크 파일의 텍스트입니다 :

#include <boost/python/class.hpp> 
#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 
#include <boost/python/list.hpp> 
#include <boost/python/object.hpp> 

[...] 

BOOST_PYTHON_MODULE(tropmodboost) { 

    using namespace boost::python; 

    class_<ConfigSpace>("ConfigSpace", init<int, int>()) 
     .def("destroy", &ConfigSpace::destroy) 
     .def("getTraceOfPerm", &ConfigSpace::getTraceOfPerm) 
     ; 


} 

답변

1

몇 초에 nm을 실행 한 후 내 객체 파일에서 정의되지 않은 심볼 _Z12simplex_freeP7simplex이 simplex.o에 단지 simplex_free으로 정의되어 있음을 발견했다. 아마도 gcc를 사용하여 simplex.c에서 컴파일 되었기 때문일 것이다. 다른 말로하면, gcc와 g ++는 서로 다른 이름을 붙인 것 같아요. 그래서 모든것을 g ++로 바꿨고 C 코드를 C++로 컴파일했고, 문제가 해결되었습니다.