2017-12-27 4 views
-1

저는 결국 오픈 소스가 될 C 정적 라이브러리에서 작업 중이므로 Windows 및 Ubuntu에서 크로스 컴파일하여 이식성 문제를 보완합니다.NetBeans를 사용하는 Linux 정적 라이브러리에서 기호가 누락되었습니다.

내가 가지고있는 문제는 오브젝트 파일 중 하나의 심볼이 Linux 빌드에서 생략되었다는 것입니다. Windows에서 VS2015를 사용하여 라이브러리를 빌드하면 모든 기호가 나타납니다.

저는 대부분 Windows 용으로 개발하는 데 익숙하므로 대부분의 빌드 시나리오에서 IDE를 사용하고 있습니다. 우분투에서 NetBeans를 사용하고 있는데 문제가 gcc를 이해하고 있는지 또는 NetBeans가 올바르게 설정되어 있는지 확실하지 않습니다.

세부

우분투 16.04LTS 사용하여 GCC (우분투) 5.4.0

넷빈즈 IDE 8.1 C/C++

라이브러리는 3 개 소스 파일과 2 개 헤더 파일로 구성

queue.c --> queue implementation 
memutil.c --> memory utilities 
mylib.c --> main library implementation 

queue.h --> included by queue.c and mylib.c 
mylib.h --> header file for the static library 

mylib.h 헤더에는명령 행의 MEMCHECK 기호에 따라 달라지는 조건부로 랩핑 된3210 소스 파일. 마찬가지로 소스 파일 memutil.c의 코드도 마찬가지입니다. MEMCHECK 기호는 라이브러리를 빌드 할 때 정의되지만, Linux 빌드 후 libmylib.anm을 실행하면 memutil.o 오브젝트 파일에 대한 기호가 나열되지 않습니다. Windows에서 mylib.lib 파일을 보면 memutil.obj의 모든 기호가 나열됩니다.

이제 mylib.h 헤더가 포함 된 스터브 된 원본 파일을 추가하면 모든 기호가 libmylib.a 라이브러리에 있습니다. 거기에 일종의 헤더 파일 상호 작용 오작동이있는 것 같아요,하지만 그게 무엇인지 또는 어떻게 수정해야하는지 알 수는 없습니다. 내가 생각할 수있는만큼 다양한 구두로 Google에서이 코딱지를 찾았지만 기쁨은 없었습니다.

다음은 넷빈즈 디렉토리의 모든 소리를 출력, 더 적은을 구축입니다 : 헤더 파일을 포함에

gcc -c -g -Wall -DMEMCHECK -MMD -MP -MF "build/queue.o.d" -o build/queue.o queue.c 
gcc -c -g -Wall -DMEMCHECK -MMD -MP -MF "build/memutil.o.d" -o build/memutil.o memutil.c 
gcc -c -g -Wall -DMEMCHECK -MMD -MP -MF "build/mylib.o.d" -o build/mylib.o mylib.c 

ar -rv dist/Debug/GNU-Linux/libmylib.a build/queue.o build/memutil.o build/mylib.o 
ar: creating dist/Debug/GNU-Linux/libmylib.a 
a - build/queue.o 
a - build/memutil.o 
a - build/mylib.o 
ranlib dist/Debug/GNU-Linux/libmylib.a 

BUILD SUCCESSFUL (total time: 3s) 

스텁이에 대한 수정 될 수 없다, 그것은 할 수 있습니까? 그것은 효과가 있지만 너무 조잡한 것 같습니다. 게다가, 나는 VS2015에서 gcc가 필요하고 필요하지 않다는 것을 정말로 믿을 수 없다.

+1

약간 털이 나지 만'-E' 옵션으로 컴파일하는 것이 좋습니다. 이것은 전처리 기가 실행 된 후에 소스 코드를 보여줄 것이다. 그래서'-DMEMCHECK'가 당신이해야한다고 생각하는 것을하는지 알 수 있어야한다. 코드는'#include '다음에 끝날 것입니다. 출력을 파일로 리디렉션 할 수 있습니다. 'gcc -E code.c> ppCode.c' https://stackoverflow.com/questions/3742822/preprocessor-output – yano

+0

은'-Wextra' 플래그를 사용하여 컴파일하여 설정하는 것이 좋습니다 더 많은 경고. – yano

+0

@yano : 조건부에 문제가있는 경우 Windows 빌드도 불안정합니다. –

답변

0

음, 해결책을 찾았지만 정확하지 않으므로이 대답을 채점하지 않습니다. 이유가 해결책입니다.

나는 컴파일러 라인에 -Mxx 플래그를 발견 :
gcc -c -g -Wall -DMEMCHECK -MMD -MP -MF "build/... 

그래서 난 다시 구글에 가서이 사이트를 발견 : Auto-Dependency GenerationMake 빌드 의존성의 생성 및 추적을 처리 가진 커버한다.내가 찾은까지

은 그럼 내가 넷빈즈에서 모든 단일 메뉴 항목을 통해 빗질 시작이 하나

도구 -> 옵션 -> C/C++ -> [/ 오프에] 생성 된 메이크

을 체크인 의존성을 사용

스위치를 지우고 누락 된 모든 기호가 라이브러리에 나타납니다. 그러나 -Mxx 플래그는 빌드 출력의 컴파일러 행에 계속 남아 있습니다. 이제 NetBeans의 makefile 생성은 빌드 구성 및 대상을 기반으로 빌드시 메이크 파일을 생성하기 위해 약 5 개의 개별 makefile 템플리트와 3 또는 4 개의 서로 다른 XML 구성 파일을 사용합니다. 자동 종속 플래그가 해당 스위치를 뒤집어서 비활성으로 표시되는지는 알 수 없습니다.

그러나 위에서 언급 한 웹 사이트의 정보를 올바르게 읽는 경우 -Mxx 플래그가 실제로 Make을 지원하기 위해 gcc에서 사용되므로 어떤 방식으로 다른 해석을 사용하게 될지 잘 모르겠습니다. NetBeans가 그랬습니다. 저 메이크 파일 템플릿에는 많은 대체물이 있지만 Autoconfig/Make 마법사가 아닌 저와 함께 간단히 놓친 것 같습니다.

그래서 소스 파일 중 실제로 메모리 유틸리티의 프로토 타입이 포함되어 있지 않으므로 (라이브러리 헤더 파일에 포함되어 있기 때문에) 라이브러리 소스 파일이 포함되어 있지 않으므로 (클라이언트에 포함시키기위한 것임) 코드) - NetBeans 종속성 검사기는 해당 기능이 라이브러리에서 필요하지 않다고 결정했습니다.

관련 문제