c++ - cmake make install



또 다른 "ld:아키텍처 x86_64에서 찾을 수없는 심볼"부스트와 함께 문제, 이번에는 mgiza로 (1)

그러한 일반적인 질문을하는 것에 대해 사과드립니다. 거기서 작동하는 솔루션을 찾을 수 없거나 구현하기에 충분히 명확합니다. 나는 단순히 mgiza 를 설치하려하고있다. 다음은 INSTALL 파일입니다.

cmake .
make
make install

If you want to install to a custom location, add the following flag when you run cmake:
-DCMAKE_INSTALL_PREFIX=/path/to/custom/location

NOTE: Boost Version 1.48 has problem with the code, you can use either 1.46 or 1.50+. Unfortunately 1.48 is shipped with Ubuntu 12.04 LTS, you can either download and compile libboost 1.50+ from their website, or just do this:
sudo apt-get install libboost1.46-all-dev

쉽게 보이죠? cmake . 에서 타이핑 cmake . 명백한 문제없이 작동합니다. 불행하게도 make 는이 두려운 오류 ( "undefined symbols ...")를 부스트로 실행합니다.

1 warning generated.
Linking CXX executable ../bin/d4norm
Undefined symbols for architecture x86_64:
  "std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::string::_Rep::_S_empty_rep_storage", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::string::assign(char const*, unsigned long)", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

라이브러리에 libstdc ++가 아니라 libc ++임을 암시하는 C ++ 코드를 컴파일하는 데 clang을 사용하기 때문에 다른 질문에 따라 Mavericks의 문제입니다. 완성을 위해 다른 사람들이 내 실수를 재현 할 수 있도록 OS X 10.9.5, Xcode 6.1을 사용하고 있으며 나의 부스트 버전은 1.56입니다 (부스트 빌드를 통해 설치되었습니다).

이제, 거기에 몇 가지 수정 프로그램이 있어야합니다. 맞습니까? 그들 중 일부를 보자 :

  1. -m32 플래그 적용 : Makefile에 "g ++"가 없기 때문에 적용 할 수 없으며 "Cmake"생성 파일이기 때문에 편집하지 말라고 명시 적으로 알려줍니다.
  2. 헤더 파일에 무언가를 정의 하지 않는다. 코드를 컴파일 할 준비가되어야하기 때문에 적용 할 수 없다.
  3. 링커에 -stdlib = libstdc ++ 추가하기 : make 명령에 이것을 추가하는 방법을 모르겠습니다. 나는 단지 make -stdlib=libstdc++ 시도해 보았다. 위의 에러를 피하는 것처럼 보였으 나 몇 가지 추가적인 에러가 make -stdlib=libstdc++ . make: *** [all] Error 2 (그게 무슨 뜻인지는 모르겠다.)
  4. 적절한 부스트 라이브러리에 연결하기 : 거기에는 "적절한 부스트 라이브러리에 링크 만하면된다. Q / 어떻게 할 것인가?"라는 코멘트가있다. 불행히도, 나는 내 문제를 해결하기 위해 주석 작성자가 링크 한 질문을 생각하지 않습니다.
  5. Qt와 부스트 연결하기 : 나는 Qt를 사용 하지 않기 때문에 이것이 적절하지 않다고 생각한다. 그리고 LIBS += [...] boost 라인에 어디에 넣을 지 모른다.
  6. 누락 된 파일 링크 : g++ 실행할 때 연결 문제가 더 많은 것 같지만 g++ 가없는 Makefile을 사용하고 있습니다.
  7. g ++ 대 gcc 사용 : cmake 사용하고 있기 때문에 내가 사용하는 것을 어떻게 바꿀 수 있는지 모르겠습니다 ...
  8. 링크 명령 변경 : 다시 한번 컴파일을 cmake / make 에서 gcc 어떻게 바꿀 수 있는지 모르겠습니다. (참고 :이 시점부터 gcc 또는 g ++에 무언가를 추가하여 대부분의 질문을 무시합니다.)
  9. 표준 C ++ 라이브러리 변경 : 해결책은 Xcode로 이동하여 라이브러리를 변경하는 것입니다. 나는 이것이 올바른 접근법이라고 생각하지 않으며 Xcode에서 설정을 변경하면 (아마도 Xcode의 GUI에 대한 경험이 없다) 어떤 경우에는 무언가를 망칠 것입니다.
  10. Xcode에서 라이브러리 링크하기 :이 목록에서 # 9와 비슷한 경우라고 생각합니다. 여기에 대한 답변은 부스트를 설치하기 위해 macports 대신 homebrew를 사용하는 것을 권장하지만 이전에 제가 부스트를 설치하기 위해 homebrew를 사용했다고 이미 말했습니다.
  11. clang을 사용하여 컴파일 : 비슷한 문제이지만 어떻게 cmake를 얻거나 clang으로 컴파일합니까?
  12. (인기있는) 비트 코 (bitcoin) 문제에서 : 이제 이것은 재미 있어 보입니다! 수많은 사람들이 저의 잘못으로 달아났습니다. 불행히도, 합의 또는 쉬운 해결책이없는 것 같습니다. 구현할 수없는 몇 가지 솔루션이 있습니다. 예를 들어, "imbolo"에 의한 한 가지 해결책은 cxxflag 플래그를 사용하여 부스트를 컴파일하는 것입니다. 그러나 그 의미는 무엇입니까?

그래서 mgiza를 올바르게 설치하는 방법에 약간의 상실감이 있습니다 ... 제 말은, 제가 mgake를 사용하여 cmakemake 주는 전체적인 요점은 컴파일하는 것에 대한 더러 욲 세부 사항에 대해 걱정할 필요 가 없다는 것입니다 , 권리? 하지만 다른 문제를 만들려고 할 때이 문제가 발생했기 때문에 이것은 단순한 mgiza 문제가 아닙니다. 나는 (C) Makefile의 고차원 적 아이디어를 이해하지만 저급 세부 사항은 이해하지 못한다.


의견 제시 자의 우려 사항 중 일부를 해결하려면이 문제를 해결하는 가장 좋은 방법은 최대한 시스템을 지우고 처음부터 프로세스를 시작하는 것입니다.

또한이 글이 게시 된 이후 OS X 10.10 Yosemite가 출시되어이 문제가 해결되었을 수도 있습니다 (IIRC 문제는 대부분 10.9 및 clang / gcc 컴파일러 변경으로 인한 것임).