부스트를 사용하는 타사 라이브러리에 연결하려고합니다. 내가 올바른 부스트 라이브러리 (libboost_program_options.a)에 연결했지만 여전히 그것을 찾지 못했습니다.정의되지 않음 부스트 참조
오류 MSG는 (명확성을 위해 약간의 형식) :
undefined reference to `boost::program_options::validate(boost::any&,
std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&,
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*,
int)'
나노 --demangle libboost_program_options.a | grep validate
boost::program_options::validate(boost::any&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&,
bool*,
int)
boost::program_options::validate(boost::any&,
std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&,
std::string*,
int)
boost::program_options::validate(boost::any&,
std::vector<std::string, std::allocator<std::string> > const&,
bool*,
int)
boost::program_options::validate(boost::any&,
std::vector<std::string, std::allocator<std::string> > const&,
std::string*,
int)
두 번째 레코드는 비슷하지만 외관상으로는 충분히 근접하지 않습니다. Boost를 컴파일하여 라이브러리에있는 내용과 일치하는 서명을 얻으려면 어떻게해야할까요? 라이브러리 소유자가 Boost의 어떤 버전을 사용 중인지 확인해 달라는 요청을 받았지만 아직 회신하지 않았습니다.
g ++ 버전 4.8.5를 사용하는 CentOS 7 상자에 있습니다. 하지만 내가 연결하려고하는 라이브러리는 C++ 11을 많이 사용하고 g ++ 6.1로 컴파일 되었기 때문에 devtoolset-6를 설치하면 g ++ 6 환경 (g ++ 6.3.1)을 얻을 수 있습니다. (g ++ 버전 6.3.1)
다운로드했습니다. Boost를 처음부터 (v1.65.1) 빌드하여 시스템 버전이 아닌 동일한 컴파일러로 빌드하십시오.
편집 ... John Zwinck는 올바른 방향으로 가고 있다고 생각하지만 새로운 ABI로 컴파일 할 수있는 부스트 라이브러리를 얻을 수 없습니다.
유효성 검증() 기능은 기본으로 아래로 빌드를 스트리핑 value_semantic.cpp
에서 발견하고, 추가 플래그는 설명 :
g++ -std=c++11 -D_GLIBCXX_USE_CXX11_ABI -c -o test.o libs/program_options/src/value_semantic.cpp
nm --demangle test.o | grep validate
00000000000008b6 T boost::program_options::validate(boost::any&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, bool*, int)
0000000000000c02 T boost::program_options::validate(boost::any&, std::vector<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >, std::allocator<std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > > > const&, std::string*, int)
00000000000005f2 T boost::program_options::validate(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, bool*, int)
0000000000000b9a T boost::program_options::validate(boost::any&, std::vector<std::string, std::allocator<std::string> > const&, std::string*, int)
이 매크로 _GLIBCXX_USE_CXX11_ABI는 GCC 5.1 사용할 수 있습니까?
부스트 빌드에'g ++ -std = C++ 11'을 사용해 보셨나요? – burlyearly
아니요 - 제가 아는 한 g ++ v6의 기본값은 C++ 11입니다. 나는 그것에 대해 생각하고 있었는데, Boost 빌드 시스템으로 그것을 가져 오는 방법을 알아야했습니다. – CoAstroGeek
그냥 보았습니다. ccc 14가 gcc v6의 기본값입니다. https://gcc.gnu.org/projects/cxx-status.html#cxx11 – CoAstroGeek