2011-02-08 2 views
12

인사말 전체,CMake 및 GCC를 사용하여 Mac에서 정적 라이브러리를 작성 하시겠습니까?

나는 내 응용 프로그램과 나중에 링크되는 정적 라이브러리가 있습니다. 내 개발 환경은 CMake, GCC (Linux, Mac), MinGW (Windows)입니다.

Linux 및 Windows에서 아무 문제없이 정적 라이브러리를 컴파일 할 수 있습니다. (Mac에서도 내 응용 프로그램에 공유 라이브러리를 구축 할 수 있습니다.)

편집 : 공유 라이브러리로 라이브러리를 컴파일했는데 정상적으로 작동했습니다! 정적 라이브러리 구축하기 위해 다음과 같이 내가 CMakeFile를 구성

: 단계를 연결하는 동안

add_library(centi STATIC ${base_srcs} ${crv_srcs} ${node_srcs} ${trnk_srcs} ${defl_srcs} ${infl_srcs} ${track_srcs} ${callback_srcs} ${extract_srcs}) 

, 그것은 다음과 같은 오류를 제공하고 어떻게 든 "libcenti.a"를 구축 할 수 있습니다.

Linking C static library 
lib/libcenti.a /usr/bin/ranlib: file: 
lib/libcenti.a(crv_in_rgn_to_bnry_img.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_initialize_by_circle.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_initialize_flgs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_nodal_interval_min_and_max.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_remove_all_nodes.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_reset_nodal_forces.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_center_coords.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_left_ptch_rgn_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_out_rgn_mean_and_var.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_para.c.o) has 
no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_set_right_ptch_rgn_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_to_in_rgn_hist.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(crv_to_out_rgn_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_initialize_by_circle.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_initialize_by_image_frame.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_stk_paint_nodes_and_pixs.c.o) 
has no symbols /usr/bin/ranlib: file: 
lib/libcenti.a(trnk_stk_to_inner_defl_ordn.c.o) 
has no symbols 

하지만 내 응용 프로그램과 라이브러리의 위 연결할 때, 그것은 "정의되지 않은 기호를"오류 제공 :

Undefined symbols: 
"_setActiveDrawingTrunk", referenced 
from: 
     RzPluginAlgoCnty::initCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     RzPluginAlgoCnty::clearCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _extract_contour_update_tracking in 
libcenti.a(extract_contour_update_tracking.c.o) 
     _extract_contour_update_tracking in 
libcenti.a(extract_contour_update_tracking.c.o) 
"_updateCurveUICallBack", referenced 
from: 
     RzPluginAlgoCnty::initCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     RzPluginAlgoCnty::initBulkCallBacks() 
in RzPluginAlgoCnty.cpp.o 
     RzPluginAlgoCnty::clearCallBacks()  
in RzPluginAlgoCnty.cpp.o 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _bg_trnk_trck_ordn in libcenti.a(trnk_trck_ordn.c.o) 
     _crv_update_1time in libcenti.a(crv_update_ordn.c.o) 
     _crv_update_1time in libcenti.a(crv_update_ordn.c.o) ld: 
symbol(s) not found 

모든 팁을? Mac에서 정적 라이브러리를 작성할 때 특별한 매개 변수를 추가해야합니까?

편집 : 라이브러리를 SHARED 라이브러리로 컴파일했는데 정상적으로 작동했습니다.

+0

공유 라이브러리로 컴파일하여이 문제를 해결했습니다. –

+0

* "연결 단계 중 다음 오류가 발생하고"libcenti.a "를 빌드하십시오. 여하튼 .... 기호가 없습니다. * - 오류가 아닙니다. 그들은 [쓸모없는] 경고입니다. OS X에서'art'와'ranlib'이 아닌'libtool'을 사용해야 할 것입니다. 나는 그것을 억제 할 수있는 옵션이 있다고 생각했지만, 지금은 찾을 수 없습니다. 또한 [Silence "목차가 비어 있습니다"경고 (https://stackoverflow.com/q/27602998/608639)를 참조하십시오. – jww

답변

6

마찬가지의 문제는 여기에 설명되어 있습니다 : 전체 청소를 할과 평행하지 빌드를 실행하는 http://lists.macosforge.org/pipermail/macports-tickets/2008-June/010680.html

시도합니다.

그리고 this guide은 다음 "=/usr/local/bin을하고 수출 PATH"sudo는 포트 자동 생성의 autoconf automake를 나노 libtool이 libsdl patchutils 전복 wget을 gmake를 설치 "MacPorts를 설치하는 것을 권장합니다 :/usr/지방/sbin에한다 : $ PATH "

+1

Mac 'ar'이 (가) 비표준이므로 문제가 될 수 있습니다. – osgx

+2

@umanga, 문제를 해결 했습니까? 방법? – osgx

7

ranlib의 경고는 해당 오브젝트 파일에 작동 코드가 없음을 나타냅니다. 해당 소스 파일을 검토하여 포함 된 코드가 Mac에서 컴파일되어야하는지 확인해야합니다. 코드가 다른 곳으로 포팅되었지만 조건부 컴파일이 Mac을 올바르게 인식하지 못했을 수 있습니다.

'슬램 덩크'진단이 아닙니다. 누락 된 기호는 두 그룹으로 명확히 구분됩니다. 즉, trnk과 관련된 기호와 crv과 관련된 기호가 있으며 파일은 두 그룹 (마찬가지로 접두사 trnk 및)으로되어 있지만 파일에 따라 다른 기능이 정의되어있을 수 있습니다. 그래서 빈 객체 파일에 해당하는 소스 파일을 살펴보고 누락 된 함수를 볼 수 있는지 확인합니다 (보고 된 누락 된 심볼 이름의 맨 앞에있는 밑줄을 무시했을 수 있습니다). 해당 기능이 해당 파일에 정의되어있는 경우 ranlib에서 불만 사항을 검토해야합니다.

때때로 불편한 순간에 디스크 공간이 부족한 경우, 크기가 0 인 오브젝트 파일 (기호가없는 파일)이있을 수 있습니다. 이 경우 빈 오브젝트 파일을 제거하고 공간을 확보하십시오. 이미 완료 했어야하며 다시 빌드하십시오. 에서라도에 정적 라이브러리와

+0

대답 해 주셔서 감사합니다. –

+1

작동 코드가없는 오브젝트 파일을 무시하도록 ranlib에 지시하는 방법이 있습니까? 다른 플랫폼 (예 : OSX 용으로 컴파일 할 때 Windows 전용 구현)에서 사용하기 때문에 이러한 개체 파일이 몇 개 있습니다. 내 IDE에서 파일을 볼 수 있기를 원하기 때문에 (QtCreator를 사용하여) 편집 할 수 있기 때문에 다른 플랫폼의 구현을 내 cmake에 유지하고 싶습니다. 불행히도 QtCreator는 오류라고 생각합니다. – mchiasson

+3

신경 쓰지 마라, 나는 그것을 발견했다고 생각한다. "-no_warning_for_no_symbols" – mchiasson

8

불행히도 -no_warning_for_no_symbols으로 설정하는 것만으로는 충분하지 않을 수 있습니다.Mac에서 ar 명령을 실행하면 ranlib이 실행되어 "have have symbols/usr/bin/ranlib"메시지가 표시됩니다. 다음 CMake 규칙을 사용하여 Mac에서이 메시지를 중지 할 수 있습니다

SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 
SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 
SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 

ARCHIVE_CREATE "크레아티닌"설정이 당신을 위해 대한 ranlib를 실행 아칸소 을 유지합니다. ARCHIVE_FINISH 설정이 ranlib에서 누락 된 기호에 대해 불만을 나타낼 것입니다.

"기호 없음"메시지를 표시하려면 두 규칙 집합을 모두 사용해야합니다. CMake 초보자를위한

한가지 더 다음은 CMake는 명령은 link.txt 파일로 덤프하는 AR 및 대한 ranlib에 대해 생성하는 명령. 아카이브 생성에 문제가 있다면, link.txt를보고 CMake가 당신을 위해 무엇을하는지 볼 수 있습니다.

관련 문제