우분투 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 to
Boost::filesystem::path::filename() const' /tmp/ccyWlRx6.o: 함수 Boostboost::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.so
및 libboost_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
또한 같은 이유로 토론이 붉은 청어라는 점에 유의하십시오 . 당신은 그것을 사용하지 않았지만 -L
g++가 이 라이브러리를 찾았습니다.그래도;따라서 라이브러리가 포함된 디렉토리가 컴파일러의 기본 라이브러리 검색 경로에 없는 경우에는 분명히 문제가 없습니다.
넌 시도조차 하지 않았으니까달리기이 프로그램에서는 귀하의 질문에 따르면 동적 로더가 라이브러리를 찾는지 여부를 알 수 없습니다. 하지만 그럴 수도 있습니다.
답변2
링커가 일반적이지 않은 위치에서 라이브러리를 찾도록 하려면 옵션을 사용하여 -L
라이브러리가 있는 디렉터리를 지정해야 합니다.
런타임 링커가 런타임에 동일한 라이브러리를 찾도록 하려면 링커를 사용하여 -R
바이너리에 태그를 추가하세요.RUNPATH
ldconfig는 1980년대에 이 형식을 사용했습니다 . a.out
왜냐하면 .RUNPATH
ELF
답변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