저는 결국 오픈 소스가 될 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.a
에 nm
을 실행하면 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가 필요하고 필요하지 않다는 것을 정말로 믿을 수 없다.
약간 털이 나지 만'-E' 옵션으로 컴파일하는 것이 좋습니다. 이것은 전처리 기가 실행 된 후에 소스 코드를 보여줄 것이다. 그래서'-DMEMCHECK'가 당신이해야한다고 생각하는 것을하는지 알 수 있어야한다. 코드는'#include '다음에 끝날 것입니다. 출력을 파일로 리디렉션 할 수 있습니다. 'gcc -E code.c> ppCode.c' https://stackoverflow.com/questions/3742822/preprocessor-output – yano
은'-Wextra' 플래그를 사용하여 컴파일하여 설정하는 것이 좋습니다 더 많은 경고. – yano
@yano : 조건부에 문제가있는 경우 Windows 빌드도 불안정합니다. –