{"componentChunkName":"component---src-templates-post-template-jsx","path":"/works/posts/2022-07-25--001","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"50f124f6-2522-52b7-b800-ed62d03e8e88","html":"<p>이번에 사진 피처 추출 LIB를 프로젝트에 적용하게 되어 해당 작업에 대한 내용을 정리한다.</p>\n<h2>1. gradle 에 dependency 적용</h2>\n<ul>\n<li>files 함수를 사용하여 jar 파일 의존성 추가</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/f8ad65a45a537064a574b7d72bf01910/1c1a4/001-01.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 14.583333333333334%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAkklEQVQI11WOwQ6DMAxD+R7aNGkhbdlKJSS2SbvssP//Fq+wTYLDk5wottPdq8fGWhiXRIiqSCkhNvSvY4RGhSULY80Zc9Q9uufi8X6MeK0BtypY5hFzrZjKFTlnlFIQsyJOChkYHNwJJwTnCex/geIs8kjQQEhD+zAYiPftUOCcg7Ds7cT2az5AG21P3Gbu98APbd9fHyPcS84AAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/f8ad65a45a537064a574b7d72bf01910/d9199/001-01.png\"\n        srcset=\"/devHistoryBlog/static/f8ad65a45a537064a574b7d72bf01910/8ff5a/001-01.png 240w,\n/devHistoryBlog/static/f8ad65a45a537064a574b7d72bf01910/e85cb/001-01.png 480w,\n/devHistoryBlog/static/f8ad65a45a537064a574b7d72bf01910/d9199/001-01.png 960w,\n/devHistoryBlog/static/f8ad65a45a537064a574b7d72bf01910/1c1a4/001-01.png 1046w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<br/>\n<h2>2. intelliJ에 동적 라이브러리 적용</h2>\n<h3>2.1. project settings 에 동적 라이브러리 적용</h3>\n<ul>\n<li>Project Structure(<code class=\"language-text\">command</code> + <code class=\"language-text\">;</code>)  → Libraries → New Project Library → Java</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/bb57845b2785f5a2a3ace4862a243022/18872/001-02.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 608px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 64.16666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAACp0lEQVQ4y2WTuW4UQRCG5y0AIUNAggUWYGR7j7mPnbNn59o5vDvr3bXXQIAcICdIEIBIOGwhQeCQByEwEiKDyAghv8tPTS8YGYJff3f16OuaqmrB6NnQrR4aV3QDoqKiIyvn1JXVM3XOrZX/JKimDc0iaM+BqOroKBq656RzCNfvWFtSFmA66/7zvWA4ERQz4JKNxhlkrsVe1DzK3oNpu1AMk2RhOJ5ANXsEls+y/pO5IJkhOqqHruajrXhoyS5Xm2KSwfiZahHUCaDZPjSCp+UIpkuXGg4lQLJcvpYMG0I+3EZWTdHPasT5GNV4F02MJUOIesCBhmkgiUPszGqUZYbNKsN8u0Y9ylEPB3w9Ivf9HoQwHWE4ucehjZJiQhlMOLDbAGULq/3HWN96iY3hIdTJW6xVh7idNzrgfqdY7G8NDiC0FB9WUCAupgizMToawwbF2irVz4w58Hr+AcuPPmJ17zPSZ19x9+EXLI0/4erWMa6Mj7FUL7yRoFBnoihGmg2QphkC1odC3VY1nbtEhd+gYl9Lp5BZBseP4LAISV4gKyp4YXSu28KN+BXE8XuY8yMYO0cQt97hJsVWktdYSd9gOXyBrpljb7KPsM+Q5jmiJEVEl5u2Q5C/M8m7fGF2gvX9H/Cen0J/+hPqk1Nc2j7B5Z1G33Fx+g1r9gzzMgILenDDhLJkcFnIR6iZ3cZlzVxk2LJKONku3PwB3MF9tHubaFsVeYUOrVtGCdG20WKMMvJhez69LBsqQZrZ5PAghOU08+pAEDUKBs0vVGBxQa8mgEQxSafZ0j16ig4034U13EQ/TnntWJzw2oW07ycZkkHBnUUJAXWGgEYkq2YoRnOEaU1DHvChlowQXeq2Fniw6hHVjhpXlBzkN0CqZZzl1JySAwMC/gK5w+++WrLG3gAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/bb57845b2785f5a2a3ace4862a243022/18872/001-02.png\"\n        srcset=\"/devHistoryBlog/static/bb57845b2785f5a2a3ace4862a243022/8ff5a/001-02.png 240w,\n/devHistoryBlog/static/bb57845b2785f5a2a3ace4862a243022/e85cb/001-02.png 480w,\n/devHistoryBlog/static/bb57845b2785f5a2a3ace4862a243022/18872/001-02.png 608w\"\n        sizes=\"(max-width: 608px) 100vw, 608px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<ul>\n<li>동적 라이브러리 디렉토리 선택 및 적용 모듈 선택</li>\n</ul>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/79a2fb4f98d7333d2200a49cc80ea009/6244b/001-03.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 446px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 41.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAABYlAAAWJQFJUiTwAAABP0lEQVQoz53Py0rDUBAG4KMFW124cdGYpEnEnJykpGnS9DSX1gu6EIpab0UQBDe60qUg+Azim9S6Ke7cVBE3+ka/x4ArW7AuPmaYYYYZous6NEWGIWIQBEjTFEmSQNM0fPcmRXTDwJIXQjcppGIRkiRBluV/LcsWquKS4H6A6skV9ttbiOIEsqJALZWgqupoolcag1iUIt7chtNooR748MXbjNmwGINlsSy3bSfDbDtjihnTHI34zjLWKyGYW4PvuYh4iLhRQzPhiHkNSRSiGXOkUT2rxzyA61CUmYmy/RspdHowbp6xePGE6vkA84d9zOw+YG7vEbNCodNHfqeHvKj9KHTGI7nuC9jdB9Trd2zcfmLh7A3kYIjpoyGmhFz3dSLELIc4Pr1EtNoG9VJ4fA1efQWVsIWKiNTlsAT6R1/cEwUzLMPoLAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 03\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/79a2fb4f98d7333d2200a49cc80ea009/6244b/001-03.png\"\n        srcset=\"/devHistoryBlog/static/79a2fb4f98d7333d2200a49cc80ea009/8ff5a/001-03.png 240w,\n/devHistoryBlog/static/79a2fb4f98d7333d2200a49cc80ea009/6244b/001-03.png 446w\"\n        sizes=\"(max-width: 446px) 100vw, 446px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/c6f14343c9dc05d5e2cee30aa6ad2ac4/38cea/001-04.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 678px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 51.25000000000001%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAACDElEQVQoz3WSy27TQBSG/RpINFtYwIJe47udOGnt2I7jNE16i9rSliYFFQkJiRJoqvYJAFVswuV52BQQQtAu2vIgHzMm5VKJxaf/n/8ce2bso/TCgPWZCno6w1THxbKK6I5LoTxDa3GZuYVF6nMt5pfa2VqqrOm2i+kW/8FwCih+waMoF56H7hcwRSgLlshdr0yhNI0j9NK7AvmwfKEx7DWGXmZKKQiJkhpxUmfaj6lUU/yoSlSrE8QJtUYzI4hrhKJH1pPZJuncPHHayLJU3ED2yI2USr1B1F4jqIYktQg/KBMLH8cVwtDPvGnp6IYqPof2G9vWMzX/8rploVitx6idAdrGe7ytd2irA9zNt9jrbzDWBjgbAyaXjpgQ3Exf/ocX3EhfMV5somjrrxnbPUbdu6B8eIHaO8PZP8fun6MJL9Xu/8jIdU8Z6Qi6VxDZ9e0zRisPUJzOEflnHzCfn1I5PMV4+o3S/gle/wSz953C3gm+yO88+sq1u5/IbX5mRCA1t/FxyDG5rS9MxPfFCYN5JpN7GGkXe4hZ+4OedIa6zUTYyZiKpHYZr+4wFu8wKhivPkT1IhTDNNF1NUO7gvwRUg1Tp5pEtNsLrKws02gkWGJ8bs8+wVw9wF474FZjF80LxQktB9V0yBv2L6S/ZJjJui3msOSHGXIWVdtjtNRkKlgkLxgrt8jbRX4ClPmOR0RiZWUAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 04\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/c6f14343c9dc05d5e2cee30aa6ad2ac4/38cea/001-04.png\"\n        srcset=\"/devHistoryBlog/static/c6f14343c9dc05d5e2cee30aa6ad2ac4/8ff5a/001-04.png 240w,\n/devHistoryBlog/static/c6f14343c9dc05d5e2cee30aa6ad2ac4/e85cb/001-04.png 480w,\n/devHistoryBlog/static/c6f14343c9dc05d5e2cee30aa6ad2ac4/38cea/001-04.png 678w\"\n        sizes=\"(max-width: 678px) 100vw, 678px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<h3>2.2. VM 옵션에 적용</h3>\n<ul>\n<li>Run/Debug Configuration → VM options 필드에 java.library.path 적용</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token operator\">-</span><span class=\"token class-name\">D</span><span class=\"token operator\">*</span><span class=\"token operator\">*</span>java<span class=\"token punctuation\">.</span>library<span class=\"token punctuation\">.</span>path<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span>동적 라이브러리 경로<span class=\"token punctuation\">]</span><span class=\"token operator\">*</span><span class=\"token operator\">*</span></code></pre></div>\n<br/>\n<h2>3. UnsatisfiedLinkError</h2>\n<ul>\n<li>동적 라이브러리가 제대로 적용이 되지 않았을 경우, 아래와 같은 UnsatisfiedLinkError 오류가 발생한다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\"><span class=\"token namespace\">java<span class=\"token punctuation\">.</span>lang<span class=\"token punctuation\">.</span></span>UnsatisfiedLinkError</span><span class=\"token operator\">:</span> no xxxxx in java<span class=\"token punctuation\">.</span>library<span class=\"token punctuation\">.</span>path<span class=\"token operator\">:</span> \nat java<span class=\"token punctuation\">.</span>base<span class=\"token operator\">/</span><span class=\"token class-name\"><span class=\"token namespace\">java<span class=\"token punctuation\">.</span>lang<span class=\"token punctuation\">.</span></span>ClassLoader</span><span class=\"token punctuation\">.</span><span class=\"token function\">loadLibrary</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">ClassLoader</span><span class=\"token punctuation\">.</span>java<span class=\"token operator\">:</span><span class=\"token number\">2429</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">~</span><span class=\"token punctuation\">[</span>na<span class=\"token operator\">:</span>na<span class=\"token punctuation\">]</span>\nat java<span class=\"token punctuation\">.</span>base<span class=\"token operator\">/</span><span class=\"token class-name\"><span class=\"token namespace\">java<span class=\"token punctuation\">.</span>lang<span class=\"token punctuation\">.</span></span>Runtime</span><span class=\"token punctuation\">.</span><span class=\"token function\">loadLibrary0</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Runtime</span><span class=\"token punctuation\">.</span>java<span class=\"token operator\">:</span><span class=\"token number\">818</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">~</span><span class=\"token punctuation\">[</span>na<span class=\"token operator\">:</span>na<span class=\"token punctuation\">]</span>\nat java<span class=\"token punctuation\">.</span>base<span class=\"token operator\">/</span><span class=\"token class-name\"><span class=\"token namespace\">java<span class=\"token punctuation\">.</span>lang<span class=\"token punctuation\">.</span></span>System</span><span class=\"token punctuation\">.</span><span class=\"token function\">loadLibrary</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>java<span class=\"token operator\">:</span><span class=\"token number\">1989</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">~</span><span class=\"token punctuation\">[</span>na<span class=\"token operator\">:</span>na<span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span></code></pre></div>\n<br/>\n<h2>4. 기타 알게된 내용</h2>\n<h3>4.1. 동적 라이브러리 확장자</h3>\n<ul>\n<li>window : *.dll</li>\n<li>linux: *.so</li>\n<li>mac : *.dylib</li>\n</ul>\n<h3>4.2. <strong>LD<em>LIBRARY</em>PATH와 java.library.path</strong></h3>\n<ul>\n<li>LD<em>LIBRARY</em>PATH 환경변수는 ‘로더(Loader)‘가 공유 라이브러리나 동적 라이브러리를 찾아야 할 때 어떤 경로를 찾아가야 하는지를 지정하는 환경변수다. 실행 파일을 찾아가는 PATH 환경변수의 라이브러리 버전이라고 생각하면 된다.</li>\n<li>로더가 라이브러리를 로딩할 때 우선적으로 LD<em>LIBRARY</em>PATH에 명시된 경로들을 찾아가면서 공유 라이브러리와 동적 라이브러리 파일을 찾게 되며, 그 다음에 표준 라이브러리 경로인 ‘/lib’과 ‘/usr/lib’을 찾게 된다.</li>\n<li>자바 애플리케이션을 실행할 때 공유 라이브러리 경로를 -Djava.library.path 옵션으로 주게 되는데, LD<em>LIBRARY</em>PATH 환경변수로 경로를 지정한 경우 -Djava.library.path 옵션으로 입력한 것처럼 경로를 찾아서 라이브러리를 로드하게 된다.</li>\n<li>결론은, <strong>LD<em>LIBRARY</em>PATH 로 OS에 적용하는것과 java 실행시 옵션을 주는것은 같은 역할을 한다.</strong></li>\n</ul>","fields":{"tagSlugs":["/tags/kotlin-java/"],"slug":"/works/posts/2022-07-25--001"},"frontmatter":{"title":"동적 라이브러리 적용","tags":["kotlin/java"],"date":"2022-07-25","description":""}}},"pageContext":{"slug":"/works/posts/2022-07-25--001"}},"staticQueryHashes":[]}