g++ 컴파일시 제 개인 라이브러리를 옵션 적지않고 자동으로 링크시키려면

portugaltheman의 이미지

어떻게 하나요? 책보고 배운것은 g++ -Idirectory -Ldirectory -o hello hello.cpp -lstuff 여기까지 인데
g++ -o hello hello.cpp 만 써도 표준 라이브러리 헤더를 인클루드 하면 자동으로 링크되는것처럼, %HOME%\include 에 있는 제가 작성한 libstuff.h를 인클루드하면 %HOME%\lib 에 있는 제 개인 라이브러리를 링크되게하려면 어떻게 설정하면 되나요?

bushi의 이미지

http://www.mingw.org/wiki/HOWTO_Use_the_GCC_specs_file 에 대략의 방법이 적혀있습니다.
헤더와는 아무 상관없습니다.
pre-processor, compiler, assembler, linker 를 순서대로 실행해주는 단순 wrapper 에 불과할 뿐인 gcc 혹은 g++ 프로그램의 설정파일을 만들어주면 됩니다.

portugaltheman의 이미지

시키는대로 cpp: 밑에 -I e:\home\include 적고 link_libgcc: 밑에 -L e:\home\lib 적고 안되길래 중간에 빈칸 없애도 보고 \ -> / 바꿔도보고 뭘 해도 안됨...
libtest.cpp 코드안에 #include "libmath.h" 적고 e:\home\include 안에 libmath.h 넣어놓고 g++ -o libtest libtest.cpp 하면 안되구요
g++ -Ie:\home\include -Le:\home\lib -o libtest libtest.cpp -lmath
다치니까 되네요..

혹시 cpp: 가 아니라 cc1plus: 밑에 써야되나 싶은데 텅 비어 잇어서 뭐 추가하니까 에러가 뜨네요.. 이건 손댈줄 모르겟어요..

bushi의 이미지

링크한 문서는 그걸 보고 따라하시라고 알려드린 것이 아니라, 본인이 모르고 있는 것이 뭔지부터 알고, 그걸 찾아서 공부하시라는 뜻이었습니다.
자기가 뭘 모르는지조차도 모르고 있다는 걸 확실히 알고 계신 것 같아서 가장 유용해보이는 걸 찾아 알려드렸는데, 결국 따라하기로 흘렀고 피차 시간만 낭비했네요.

호기심은 좋은 것이라 생각합니다. 모르는 단어 같은 것을 위주로 검색해서 매뉴얼을 찾아 읽어보세요.
GCC 의 specs 편집은 평소엔 아무 곳에도 쓸 일이 절대로 없는, 그리고 절대로 없어야만 할 일이지만,
크로스 컴파일용 툴체인을 가져와서 여러가지 라이브러리 같은 것들을 추가한 본인만의 SDK 패키지를 만들고 싶다면 이야기가 달라집니다.

익명 사용자의 이미지

원래 옵션 다 써줘야 하는거고, 옵션 안 쓰면 에러납니다. 그렇게 수작업으로 하기가 곤란하니,
빌드 자동화, make, Makefile, autotools, cmake, meson, ninja 등에 대해 알아보세요.

portugaltheman의 이미지

알아야 하는게 너무 많군요 ㅎㅎ 뭐 다 공부해보죠..

jick의 이미지

처음엔 그거 다 아실 필요 없고, Makefile을 어떻게 만드는지만 찾아보세요.

서너 줄이면 됩니다.

(그 다음엔 요구 사항이 복잡해질 때마다 배우면서 살을 붙여나가면 됩니다.)

Stephen Kyoungwon Kim@Google의 이미지

질문이 좀 분명하지 않습니다. -L, -l 옵션을 제거해서 얻고자 하는 게 무엇인지요? 또, -L, -l 없이 빌드가 가능하게 한다는 게, 글쓰신 분 개발 환경에서만의 얘기인가요, 아니면 글쓰신 분이 배포한 소스를 받아 빌드하는 모든 사람들에게 가능해야 한다는 것인지요?

gcc는 해당 라이브러리 위치를 알아야 합니다. 또 무슨 라이브러리를 링크해서 실행 파일을 만들지도 알아야 하구요. 전자든 후자든 미리 약속된 일종의 preset이 있습니다. -l, -L 없이 되게 하려면 그 preset을 변경시켜 주시면 되겠죠. 그리고 -l과 -L은 서로 다른 두 개의 옵션이므로 해결책도 서로 다를 수 있습니다.

cpp나 cc1plus가 아니라 링킹 쪽 옵션을 스펙 파일에서 변경해야 되겠죠.

그런데 이렇게 변경해서 얻는 이점이 뭔지 저는 잘 모르겠네요. 소스 코드를 배포받은 사람이 빌드할 때는 어차피 -spec 옵션을 줘서 빌드하거나 자기 컴파일러 설정 파일을 업데이트 하거나 해야할 것 같습니다. 그거나 -l, -L 넣는 거나 무슨 차이인가요?

대개는 -l, -L 일일이 넣고 빌드하기 싫어하기 때문에 빌드를 돕는 프로그램들이 있습니다. make가 가장 오래 되고 기본적인 것 같은데 그것부터 한 번 읽어보세요. "gcc와 make"라고, 이 kldp 사이트 안에 굉장히 읽기 쉽지만 충실한 내용을 담은 초심자용 make 유저 가이드가 있습니다.

portugaltheman의 이미지

공부중에 알고리즘이나 모듈같은걸 만들어서 표준라이브러리가 작동하는것처럼 저만의 라이브러리를 만들어서, 다른 프로그램을 코딩할 때 #include "mylibrary.h" 이렇게 포함하고 gcc -o hello hello.cpp 이렇게 하면 알아서 링크되게.. 뭐 그런걸 하려구요 모르는게 많지만.. 좀 헛짓거리인가요? 링크할 때 마다 -I -L -l 옵션 다 치기가 좀 그렇잖아요?

익명 사용자의 이미지

원래는 그거 다 쳐야 되는게 맞아요. 그런데 그걸 편리하게 해주는 툴이 있어요.
pkg-config 이라는게 있습니다. pkg-config 에 대해 알아보세요.
활용 예.

$ pkg-config --cflags --libs gtk+-3.0
-pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/i386-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/libdrm -I/usr/include/pango-1.0 -I/usr/include/harfbuzz -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/uuid -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0
익명 사용자의 이미지

pkg-config 보다는 https://pangtrue.tistory.com/53?category=694727 이 글을 먼저 보시는게 좋을거 같네요.

Stephen Kyoungwon Kim@Google의 이미지

기본적으로는 그거 말고도 불편한 게 많습니다. 그래서 빌드 시스템이라는 것들이 있고, 언젠가는 필요한 만큼 배우셔야 합니다. 당장 -l과 -L을 덜 치고 싶다면 이런 것도 방법입니다.

#!/bin/bash
# replace -lpthread with whatever -L, -l options
g++ "$@" -lpthread

이거를 myc++에 복사 & 붙이기 하시고 -lpthread 부분을 원하시는 옵션으로 편집한 다음, /usr/bin 에다 카피하신 후, g++ 대신에 myc++을 쓰세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.