ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Mac OS] gcc 빌드시 Security Framework 링크
    C and C++ 2020. 3. 4. 00:02

     

    Mac OS에서 gcc(정확히는 g++)을 이용한 빌드 중에 Undefined Symbol이 발견되었다.

    Undefined symbols for architecture x86_64:
      "_SSLClose", referenced from:
      ...

     

    같은 커밋으로 리눅스에서는 멀쩡히 돌아가던 빌드였다.

    간단히 원인을 찾을 수 있으리라 생각했지만, 검색해도 _SSLClose가 무슨 심볼인지도 몰라 간단하지가 않았다. 

    마음을 진정시키고 nm으로 OpenSSL 심볼들을 하나하나 조사까지 했는데 거기서도 나오지 않았다.

     

    알고보니, 구글을 뒤지다 처음엔 무심코 지나간 여기에 해답이 있었다.

    If anyone is getting linker errors about missing "_SSLClose" and 
    similarly named functions, please add Apple's "Security.Framework" 
    to the Build Phases > Link Binary With Libraries area of your project target.
    
    Wes

     

    Wes란 분의 말에 조금 더 귀 기울였으면 스트레스를 덜 받았을 텐데...

    아무튼, 결론은 Security.Framework를 링크하면 된다는 것이었다.

    뒤져보니다양한 Framework가 모여있는 /System/Library/Frameworks에 위치하고 있었다.

     

    그런데 이것은 X-Code용 프레임워크라 gcc에 어떻게 연결을 할지 몰라 또 한참 고뇌에 빠졌다.

    다행 비슷한 삽질을 한 사람들이 많아서 해결책을 쉽게 찾을 수 있었다.

    -framework라는 gcc 옵션이 존재했다.

    내 경우에는 Security.Framework가 필요했고, 다음과 같이 연결을 할 수 있었다.

    $ g++ -framework Security -o target target.cpp
    $ gcc -framework Security -o target target.c

     

    -framework 옵션은 Mac OS 상에서 특별히 동작하는 옵션이라고 한다.

    cmake에 넣는 경우라면 다음과 같이 링커 옵션에 넣으면 된다.

    SET ( CMAKE_EXE_LINKER_FLAGS "-framework Security" )

     

    링크를 보면 gcc 문서에는 -Fdir 옵션이 동일한 기능을 하는 것으로 나와있다.

    솔루션을 찾고 나니 귀찮아져서 -Fdir을 시도해보지는 않았지만, 

    문서에 있는 내용이니 애플 특화 기능보다는 -F 옵션을 사용하는게 더 맞는 것 같다는 생각이 든다.

     

     

    Fin.

    반응형

    댓글

Calvin's Memo