2017-05-04 16 views
10

이미 구축 한 다른 프로젝트의 일부 dylib를 필요로하는 일부 소스 코드를 컴파일 중입니다.macOS에서 dylib 경로를 사용하는 소스 컴파일 방법 Sierra from shell

이 때마다 내가 g++이 컴파일을 찾을 수 없습니다 것을 알고

g++ some_code.cpp -I/usr/local/include -o executable_binary 

을 실행 x86_64` 아키텍처를 찾을 수 없습니다 기호 (들) : 나는

LD 받고 있어요 dylibs (/usr/local/include에 설치됨) 오류는 dylib의 일부인 많은 특정 기호를 언급하기 때문에.

나는 이미 시도했다 :

  1. 는 컴파일 옵션에 -L/usr/local/lib 추가 install_name_tool -id "@/usr/local/lib/requiredlib.dylib" /usr/local/lib/requiredlib.dylib
  2. 실행.
  3. 모든 dylib 경로를 명시 적으로 컴파일 옵션에 추가합니다.
  4. 시에라가 보안상의 이유로 변수를 설정할 수 없기 때문에 DYLD_LIBRARY_PATH을 추가하려고합니다.

DYLD_LIBRARY_PATH을 추가 할 수는 있지만 SIP를 비활성화해야한다는 것을 알고 있습니다. 나는 이것을 할 수있는 더 깨끗한 방법이 있다면 나는 원하지 않는다.

추신 : Tulip graph library에 대한 자습서 예제를 컴파일하려고합니다.

누락 된 기호는 내가 설치 한 그래프 라이브러리와 관련이 있습니다. 오류 메시지는 다음과 같습니다

Undefined symbols for architecture x86_64: 
    "tlp::saveGraph(tlp::Graph*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, tlp::PluginProgress*)", referenced from: 
     _main in tutorial001-02ee7e.o 
    "operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, tlp::Graph const*)", referenced from: 
     _main in tutorial001-02ee7e.o 
ld: symbol(s) not found for architecture x86_64 

내가 ls /usr/local/lib/requiredlib.dylib을 할 때마다 튤립의 모든 컴파일 된 라이브러리가있다.

g++ -v는 생산 :

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 8.1.0 (clang-802.0.42) 
Target: x86_64-apple-darwin16.5.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 

ls /usr/local/include/tulip/을 수행 한 후 내가 사용하려는 라이브러리의 *.h 파일의 목록을 가져옵니다.

+0

누락 된 심볼, 실행중인 g ++의 변형 등은 분명하지 않습니다. 물론 컴파일 된 라이브러리는'/ usr/local/include'에 설치되어 있지 않습니다. – pvg

+1

질문을 편집하여 세부 정보를 추가하십시오 . – pvg

+0

오류가있는 링키지에 대한 도움을 받으려면 적어도 링키지 명령 줄 및 그 출력 인 * 축 어적 *을 게시해야합니다. 의 스케치 보고서는 너무 모호하여 추측을 넘어 설 수 없습니다. –

답변

2

-rpath을 검색 라이브러리로 설정할 수 있습니다. 바이너리를 링크 한 후에는 lib의 검색 경로를 수정해야한다. g :

g++ some_code.cpp -I/usr/local/include -o binary \ 
    -L/usr/local/lib -lrequiredlib -Wl,-rpath,/usr/local/lib 
install_name_tool -change /usr/local/lib/librequiredlib.dylib \ 
    '@rpath/librequiredlib.dylib' binary 

install_name_tool 명령은 LIB가 RPATH에서 검색됩니다 이진 등의 라이브러리의 이름을 변경합니다. 올바른 이름을 모를 경우 otool -L binary을 사용하여 실행 파일과 연결된 모든 라이브러리를 확인하십시오.

rpath에 대한 자세한 정보는 ldinstall_name_tool의 man 페이지를 참조하십시오. install_name_tool-add_rpath과 함께 rpaths를 더 추가 할 수 있습니다.

4

또한, 당신은 또한 ld

undefined 옵션으로 볼 수는 처리되는 방법을 정의되지 않은 기호를 지정합니다. 옵션은 error, warning, suppress 또는 dynamic_lookup입니다. 기본값은 오류입니다.

바이너리를 컴파일하는 동안 -Wl,-undefined,dynamic_lookup이라고 부릅니다.

-lazy-lx 또는 -lazy-library path을 활용하여 라이브러리의 첫 번째 기능이 호출 될 때까지 라이브러리가로드되지 않아 어떤 경우에 도움이 될 수 있습니다.

그런 다음 @macmoonshine처럼 install_name_tool으로 이름을 변경 한 후에도 rpath 플래그를 추가하십시오. 그러나 올바른 경로를 가리 키도록하십시오. 기본적으로 Tulip은 기본 라이브러리 폴더 /usr/local에 설치되지만 설치 가이드에서 사용자 관리 디렉토리에서 수행하는 것이 좋습니다.

튤립에 필요한 모든 라이브러리에 대해 다음 명령과 같습니다.

install_name_tool -change ./build-release/lib/libtulip-core-4.11.dylib '@rpath/libtulip-core-4.11.dylib' tutorial001 

또한 튜토리얼을 컴파일하는 동안 -Wl,-rpath,./build-release/lib을 사용하십시오.

0

설치 한 x86_64 예제처럼 설치 한 .dylib도 x86_64인지 확인 했습니까?

dylibs가 x86_64임을 확인하려면 otool 또는 file 명령을 사용하십시오. 예를 들어, file /usr/local/lib/requiredlib.dylib과 같은 것을 시도해보십시오. (건축 x86_64에 대한)

requiredlib.dylib : 당신은 출력이 표시되지 않는 경우 마하-O 64 비트 동적으로 링크 된 공유 라이브러리 x86_64에 구축 할 때

그러면 문제는 일치하지 않는 아치입니다 libs 및 이러한 libs를 사용해야하는 코드를 빌드 할 때.