g++는 /etc/ld.so.conf에 추가하고 ldconfig를 실행한 후에도 /usr/local/lib/에서 .so 파일을 찾을 수 없습니다.

g++는 /etc/ld.so.conf에 추가하고 ldconfig를 실행한 후에도 /usr/local/lib/에서 .so 파일을 찾을 수 없습니다.

우분투 16.04를 실행 중입니다. second.cpp다음과 같은 C++ 소스 파일이 있습니다 .

#include <iostream>
#include <boost/filesystem/operations.hpp>

namespace bfs = boost::filesystem;

int main(){
    bfs::path p("second.cpp");
    if (bfs::exists(p))
        std::cout << p.leaf() << std::endl;
}

내가 실행하면 $ g++ -o second second.cpp다음을 얻습니다.

/tmp/ccyWlRx6.o: 함수 boost::filesystem::path::leaf() const': second.cpp:(.text._ZNK5boost10filesystem4path4leafEv[_ZNK5boost10filesystem4path4leafEv]+0x2e): undefined reference toBoost::filesystem::path::filename() const' /tmp/ccyWlRx6.o: 함수 Boost boost::filesystem::exists(boost::filesystem::path const&)': second.cpp:(.text._ZN5boost10filesystem6existsERKNS0_4pathE[_ZN5boost10filesystem6existsERKNS0_4pathE]+0x2f): undefined reference to::filesystem::detail::status(boost::filesystem::path const&, Boost::system::error_code*)' Collect2: 오류: ld가 1개의 종료 상태를 반환합니다.

그러나 을 실행하면 g++ -o second second.cpp -lboost_filesystem코드가 오류 없이 컴파일됩니다. libboost_filesystem.a, libboost_filesystem.solibboost_filesystem.so.1.67.0은 모두 에 있습니다 /usr/local/lib.

/etc/ld.so.conf다음과 같습니다.

include /etc/ld.so.conf.d/*.conf
/usr/local/lib

나는 도망쳤다 sudo ldconfig.

이것이 정상적인 행동입니까? 내가 읽은 내용에 따르면 /usr/local/lib링커가 자동으로 파일을 포함해야 하는 것 같습니다 . 그렇지 않은 경우 이를 달성할 수 있는 방법이 있습니까? 당신의 도움을 주셔서 감사합니다!

답변1

이것이 정상적인 행동입니까?

물론. 드라이버가 링크할 라이브러리를 찾는다고 컴파일러에 알리지 않으면 보시 -l boost_filesystem다시피 그렇게 하지 않으며 라이브러리를 사용하는 프로그램도 링크하지 않습니다. 귀하의 컴파일러는 마술적이지 않습니다. 프로그램이 컴파일러가 기본적으로 인식하는 C/C++/GCC 런타임 라이브러리 이외의 라이브러리와 연결해야 하는 경우 해당 라이브러리에 대해 컴파일러에 알려야 합니다.

질문 제목이 거짓말입니다. 관찰할 수 있듯이…

실행 g++ -o second second.cpp -lboost_filesystem하면 코드가 오류 없이 컴파일됩니다.

...g++하다라이브러리 찾기 /usr/local/lib: 올바르게 수행한 후 실제로 찾고자 하는 라이브러리의 이름을 알려줍니다.

-L또한 같은 이유로 토론이 붉은 청어라는 점에 유의하십시오 . 당신은 그것을 사용하지 않았지만 -Lg++가 이 라이브러리를 찾았습니다.그래도;따라서 라이브러리가 포함된 디렉토리가 컴파일러의 기본 라이브러리 검색 경로에 없는 경우에는 분명히 문제가 없습니다.

넌 시도조차 하지 않았으니까달리기이 프로그램에서는 귀하의 질문에 따르면 동적 로더가 라이브러리를 찾는지 여부를 알 수 없습니다. 하지만 그럴 수도 있습니다.

답변2

링커가 일반적이지 않은 위치에서 라이브러리를 찾도록 하려면 옵션을 사용하여 -L라이브러리가 있는 디렉터리를 지정해야 합니다.

런타임 링커가 런타임에 동일한 라이브러리를 찾도록 하려면 링커를 사용하여 -R바이너리에 태그를 추가하세요.RUNPATH

ldconfig는 1980년대에 이 형식을 사용했습니다 . a.out왜냐하면 .RUNPATHELF

답변3


/etc/ld.so.conf에 항목을 추가하는 대신 /etc/ld.so.conf.d에 구성 파일을 생성해야 할 것 같습니다 .


/etc/ld.so.conf는 라이브러리 파일 경로에 대한 구성 파일이 포함된 /etc/ld.so.conf.d 디렉토리에서 모든 구성 파일을 읽습니다 .
프로필 이름은 시스템에서 정의되지 않으므로
원하는 대로 이름을 지정할 수 있습니다(예: ) locallib.conf.
그래서, 이런 것,

/etc/ld.so.conf.d/locallib.conf

포함하다
/usr/local/lib

그런 다음 실행한 후 ldconfig.

다른 방법.
이는 시스템 전체가 아닌 로컬 환경만 활성화합니다.
에 라이브러리 경로 항목을 추가합니다 .bashrc.

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH

환경 변수를 활성화합니다
. ./.bashrc.
다음 명령을 사용하여 변수를 확인하는 것을 잊지 마십시오.

echo $LD_LIBRARY_PATH

관련 정보