2014-11-20 9 views
0

모두를 연결하지 않습니다.gcc-4.8.2는 pthread

몇 년 동안 gcc 툴체인을 사용하여 간단한 것을 컴파일하면서, 오늘 나는 이상한 현상에 맞서 달렸다.

일반적인 쿠거투 14.04를 gcc 4.8.2가 설치된 일반 데스크탑 i686 시스템에 설치했습니다. 그런 다음, 로컬 저장소에서 빼내어 잘 코딩 된 것들을 만들려고 노력하면서, 나는 수많은 '정의되지 않은 참조'메시지에 부딪쳤다. 코드가 컴파일되고 링크는 Ubuntu 11.04/gcc 4.5.2에서 잘 실행됩니다. 연결 프로세스 (-Wl, - gcc에 자세한 정보 표시)를 확인하고 작동하는 것으로 생각합니다. 링크 명령에서 지정한 모든 라이브러리를 찾습니다. objdump -t myLib.so은 정확히 예상 할 수있는 기호를 가져 오지만 링커에서는 표시하지 않습니다.
또한 pthread 라이브러리를 검사하면 기호가 붙습니다. 단, 뒤에는 @GLIBC ... stuff가 붙습니다. 지금까지 링커/로더 트릭을 확인하지 않았습니다.

같은 샘플
#include <stdio.h> 
#include <unistd.h> 
#include <pthread.h> 

static void *fooo (void *xxx) { 
    char *txt = (char*)xxx; 
    printf("My job is to print this :'%s'. Bye now!\n", txt); 
    return 0; 
} 
int main (int argc, char *argv[]) { 
    pthread_t thd; 
    pthread_create(&thd, NULL, fooo, "A POSIX thread"); 
    sleep(1); 
    return 0; 
} 

실행 아주 잘 기존 시스템에 바로 말을

GCC -l pthread에 fooo.c & &

./a.out 4.8.2와의 연결 단계에서 깨진다.
어떤 아이디어라도 대단히 환영 할 것입니다.

하는 .m

+0

당신이 [링커 순서의 오류 메시지 – sfrehse

+2

가능한 중복을 추가시겠습니까 ..... 그것은 수많은 빌드 프로세스를 나누기, 나는 토마토의 수천 gcc.gnu.org에 대한 준비가 만들어지고있는 것 같아요 - GCC] (http://stackoverflow.com/questions/45135/linker-order-gcc) –

+0

@ JoachimPileborg 한 번만 라이브러리가 프로그램에 연결되어 있기 때문에 나는 추측하지 않습니다. 정확한 오류 메시지가 필요합니다. – sfrehse

답변

1

덕분에 sfrehse하고, JoachimPileborg 등!

실제로 성공 여부는 인수 순서에 따라 다릅니다. 나는이 사실을 정적 링크에 알았지 만, gcc를 사용하여 공유 객체를 처리 할 때 새로운 점이있다.

누군가가이 의 개선점을 알고 있습니까?은 무엇입니까?

하는 .m

+0

토마토를 저장하십시오. 이것은 GCC가 아닌 링커의 속성이며, 기술적으로는 항상 [http://c-faq.com/lib/libsearch.html]입니다.)가 필요한 경우, 과거에 일부 경우에만 작동했습니다. –

+0

@Jonathan Wrong. 반드시 필요한 것은 아닙니다. 내 초기 게시물을 참조하십시오. 이 효과는 4.5.2에서 4.8.2 사이의 어느 곳에서 일어났습니다. 그리고 고대 버전에서도 - 나는 4.1.2를 실행합니다 - 물건들은 아주 잘 연결되어 있습니다. 링커 작업에 대한 힌트를 가져 주셔서 감사합니다. – Mikes

+0

"나는 그것을 시도하고 그것이 효과가 있었습니까?"내가 "과거에 일이 생겼다"고 말할 때 나에게 틀린 것을 증명합니까?링커에 대한 문서에서는 항상 명령 줄에 표시된 순서대로 라이브러리를 한 번씩 검색한다고 말합니다. 예 : [binutils 2.9.1] (http://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html)에서'-l' 옵션을 참조하십시오. –