2010-01-22 3 views
1

우분투에서 bjam을 사용하여 C++ 공유 라이브러리를 빌드하고 실행 파일에서 사용하려고합니다. 정적 (많은 정의되지 않은 참조 발생) 링크로 이후 공유로 빌드해야합니다. 괜찮아.bjam으로 공유 라이브러리 빌드 및 사용

두 관련 문제 :

1) Jamfiles의 계층 구조를 사용하여 내 EXE 프로젝트 (testServerHub)는 공유 라이브러리 (pythonManager)에 대한 종속성이 있습니다.

echo "Compiling serverHub//test" ; 

# declare project name 
project serverHub//testServerHub 
    : build-dir ../_gcc/intermediate 
    ; 

# build unit-test using these source files, dependent libraries and settings 
exe testServerHub 
    : # Source 
     ..\\..\\..\\common\\0_8_1\\test\\runner.cpp 
     successfulTest.cpp 

     # Dependent libraries by path and project name 
     ../controller/pythonManager//pythonManager 
     /boost//unit_test_framework 

    : # Settings 
     <link>shared 
    ; 

install ..\\bin : testServerHub ; 

그리고 여기 내 LIB Jamfile입니다 : 다음은 Jamfile은 exe를위한거야

echo "Compiling serverHub/controller//pythonManager" ; 

# declare project name 
project serverHub/controller//pythonManager  
    : requirements 
     <define>URTH_SERVERHUB 
    : build-dir ../../_gcc/intermediate 
    ; 

# build library using these source files and settings 
lib pythonManager 
    : ../../../../common/0_8_1/controller/pythonManager/pythonManager.cpp 
     ../../../../common/0_8_1/controller/pythonManager/cppInterfaceBase.cpp 
     cppInterfaceServerHub.cpp 
     /boost/python//boost_python 
     /user-config//python 
    : <link>shared 
    ; 

# copy and rename 
install ../../lib : pythonManager ; 

나는하여 pythonManager 공유 라이브러리가 내장 내 프로젝트 lib 폴더에 복사됩니다 ('pythonManager를 bjam'실행하는 경우 최종 설치 명령). 그러나 'bjam test'를 실행하면 testServerHub와 pythonManager가 모두 빌드되지만 libpythonManager.so는 프로젝트 lib 폴더에 복사되지 않습니다. 설치 명령은 실행되지 않습니다!

2) 좋습니다. 임시 해결 방법으로 먼저 libpythonManager.so를 빌드 한 다음 testServerHub 실행 파일을 빌드하십시오. 둘 다 컴파일하고 링크합니다. 런타임에 실행 파일은 libpythonManager.so를 찾을 수 없다는 것에 대해 불평합니다. 런타임 링커가 내 프로젝트 lib 폴더에 대해 알지 못하기 때문에 큰 놀라움은 아닙니다. 특정 디렉토리에서 공유 라이브러리를 찾도록 지시하려면 어떻게해야합니까? 또는 설치 명령이 종속 라이브러리 빌드에 영향을 미치지 않으면 libpythonManager.so를/usr/local/lib에 어떻게 설치합니까?

당신에게

시는

+0

한 가지 방법은 exe 규칙 대신 단위 테스트 규칙을 사용하는 것입니다. 이 경우 공유 라이브러리는 런타임에 어떻게 든 링크됩니다. 그러나 이것은 내 메인 실행 파일에 도움이되지 않습니다. 리눅스에서이 작업을 수행하는 적절한 방법은 무엇입니까? – sipi

답변

관련 문제