2017-11-17 10 views
-3

이것은 기본적인 질문 일 수 있지만 gcc와 링크해야하는 라이브러리는 어떻게 찾을 수 있습니까? #include <signal.h>을 사용하는 공유 라이브러리를 컴파일하려고하는데 사용하려고하면 심볼을 찾을 수 없어 실행 불능 상태가됩니다. gcc에서 플래그 -l이있는 라이브러리에 대해 구체적으로 링크해야한다고 가정하고 있습니다. 그러나 그 라이브러리가 어디에 있는지/알 수 없습니다.특정 라이브러리를 gcc와 연결

보다 광범위한 예에서 에 대한 -ldl의 링크에서 -l#include <signal.h>과 연결할 수 있습니까?

편집 :

soinfo_link_image(linker.cpp:1617): could not load library "mylib.so" needed by "/bin/test"; 
cause by soinfo_relocate(linker.cpp:975): cannot locate symbol "signal" referenced by "mylib.so"...CANNOT LINK EXECUTABLE 

사용하여 컴파일 :

gcc -fPIC -c -g -o mylib.o mylib.c 
gcc -shared -o mylib.so mylib.o -ldl 
+1

라이브러리를 실행 하시겠습니까? –

+3

라이브러리의 이름이 해당 헤더의 이름과 체계적인 관계가 없기 때문에 모든 경우에 사용할 수있는 절차가 없습니다. 'pkg-config'와 같이 어떤 경우에는 도움이 될 수있는 도구가 있지만 라이브러리를 지원하기 위해 코드를 작성해야합니다. 특별한 경우에'signal.h '의 특별한'-l' 스위치는 필요하지 않습니다. 문제가 다른 것으로 인해 발생하거나 C 라이브러리가 손상되었습니다. 실제 진행 상황을 파악하는 데 도움을 받으려면 질문에 포함 된 오류 메시지의 전체 텍스트와 수정되지 않은 텍스트를 복사하여 붙여 넣으십시오. – zwol

+1

몇 가지 오류가 있습니까? 해당 오류 메시지의 내용이 아마도 * 적어도 질문과 관련 될 수는 없습니다 *! –

답변

0

이것은 GCC 질문보다 링커 질문에 가깝습니다. 종종 라이브러리 이름은 라이브러리 설명서에서 언급됩니다. GNU/Linux 배포판에서 많은 라이브러리는 pkg-config에 대해 .pc 개의 파일을 가지고 있습니다. 그렇지 않은 경우에는 헤더 파일을 제공하는 -dev/-devel 패키지를 찾을

dpkg -S /usr/include/signal.h 

rpm -qf /usr/include/signal.h 

과 같은 명령을 사용하고

dpkg -L libc6-dev 

보고 진행할 수 있습니다 또는

rpm -ql glibc-devel 

출력을 사용하여 연결에 사용되는 .so 파일의 이름을 결정합니다. 정의 된 기호는 objdump -T, nm -Dg 또는 eu-readelf --symbols=.dynsym (많은 선택 사항)을 사용하여 볼 수 있습니다.