2012-01-16 6 views
2

몇 번 전에이 작업을했는데, 어쨌든 이번에는 붙어 있습니다. 실행 가능한 "myapp"및 자체 공유 라이브러리 "mylib"가 있습니다. 내 cmakelists에서 나는 다음과 같습니다Cmake : linking shared library

ADD_LIBRARY(mylib SHARED ${SOURCES_LIB}) 
INSTALL(TARGETS mylib DESTINATION .) 
ADD_EXECUTABLE(myapp ${SOURCES_APP}) 
TARGET_LINK_LIBRARIES(myapp ${QT_LIBRARIES} mylib) 
INSTALL(TARGETS myapp DESTINATION .) 

모든 것이 제대로 컴파일 및 링크,하지만 난 MyApp를 시작할 때, 나는 다음과 같은 오류 얻을 :

error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory 

lib 디렉토리 및 실행 파일이 설치에 존재를 예배 규칙서. 위의 cmakelists의 첫 번째 줄을

ADD_LIBRARY(mylib STATIC ${SOURCES_LIB}) 

으로 변경하여 내 라이브러리를 정적으로 만들면 모든 것이 100 % 작동합니다.

내가 뭘 잘못하고 있는지 아는 사람이 있습니까?

답변

3

라이브러리 및 실행 파일을 설치하는 동안 라이브러리를 찾기위한 런타임 경로가 실행 파일에서 제거됩니다. 따라서 라이브러리는 런타임 라이브러리 검색 경로에 있어야합니다. 예를 들어, Linux에서 LD_LIBRARY_PATH를 실행 파일을 시작할 때 설치된 라이브러리가있는 디렉토리로 설정하십시오.

+9

사용자가 설정할 수 있습니다 : 당신이 당신의 최상위 CMakeLists.txt에 다음처럼 작성할 잘하면 문제가 해결됩니다 SET을 (CMAKE_INSTALL_RPATH "$ {CMAKE_INSTALL_PREFIX}/libfolder") libfolder는 공유 라이브러리가 설치된 디렉토리입니다. 이것은 Unix 시스템에서만 작동합니다. 나는 Windows에서도 뭔가를 찾으려고 노력할 것이다. – goocreations

-1

"make install"에 대한 매우 일반적인 질문입니다. 실제로 라이브러리를 실행 파일에 연결하는 3 가지 방법이 있습니다. 프리스트, 간단한 경우에 -l -L 플래그를 사용할 수 있습니다. Benjamin이 말했듯이 LD_LIRARY_PATH를 사용하고 다음과 같이 쓸 수 있습니다 : export LD_LIBRARY_PATH=/usr/local/my_lib. 사실 이것은 좋은 방법이 아닙니다. RPATH를 사용하는 것이 훨씬 좋습니다. it에 관한 매우 유용한 문서 페이지가 있습니다. 확인 해봐. cmake에서

SET(CMAKE_SKIP_BUILD_RPATH FALSE) 
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) 
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64") 
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) 
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64") 
+0

아니야. 이것은 cmake와 ld 경로에 관한 매우 구체적인 질문입니다. 또한 귀하의 대답은 형식이 잘되어 있지 않고 작동하는 이유도 설명되어 있지 않습니다. 다른 곳의 답변에 링크하지 말고 관련된 부분을 요약하십시오. – nonchip