2014-06-06 4 views
0

Mac에서 개발 한 C++ 프로젝트가 있습니다. ninja 또는 gmake를 사용하여 문제없이 명령 줄을 통해 빌드 할 수 있지만 일단 Xcode 프로젝트를 생성하면 실패합니다.CMake 생성 된 Xcode 프로젝트가 컴파일되지 않습니다.

프로젝트 자체는 googletest를 실행하는 명령 줄 앱에 연결된 정적 라이브러리입니다.

내가 얻는 오류는 최종 실행 파일을 빌드 할 때 정적 라이브러리를 찾을 수 없다는 것입니다. 여기 내 CMakeLists.txt가 있습니다 :

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 

PROJECT(MyProject) 

SET(CMAKE_VERBOSE_MAKEFILE 0) # set to 1 for verbose Makefile 

SET(MyProject_VERSION_MAJOR 1) 
SET(MyProject_VERSION_MINOR 0) 
SET(CMAKE_BUILD_TYPE DEBUG) 

ENABLE_LANGUAGE(CXX) 

# Build the static lib 
FILE(GLOB SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp") 
FILE(GLOB G2LOG "${CMAKE_CURRENT_SOURCE_DIR}/src/g2log/*.cpp") 
FILE(GLOB LIBZIP "${CMAKE_CURRENT_SOURCE_DIR}/src/libzip/*.c") 
FILE(GLOB LIBXML "${CMAKE_CURRENT_SOURCE_DIR}/src/libxml/*.c") 
FILE(GLOB LIBXSLT "${CMAKE_CURRENT_SOURCE_DIR}/src/libxslt/*.c") 

# Settings that work with Unix, Linux and OSX 
IF (UNIX) 
    # Ideally we should use -Werror but libxml2 will break 
    SET(FLAGS "-Wno-attributes -g -Wall -std=c++11 -stdlib=libc++ -Wunused -D_GLIBCXX_USE_NANOSLEEP -m64") 
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_REENTRANT -DTRIO_HAVE_CONFIG_H") 
    FILE(GLOB to_remove "${CMAKE_CURRENT_SOURCE_DIR}/src/g2log/crashhandler_win.cpp") 

    IF (${CMAKE_BUILD_TYPE} MATCHES DEBUG) 
     SET(FLAGS "${FLAGS} -DGOOGLETEST") 
    ENDIF(${CMAKE_BUILD_TYPE} MATCHES DEBUG) 
ENDIF(UNIX) 

IF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 
    SET(CMAKE_CXX_FLAGS "${FLAGS}") 
    INCLUDE_DIRECTORIES("/System/Library/Frameworks/") 
    FIND_LIBRARY(APP_SERVICES_LIBRARY ApplicationServices) 
ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 

IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux") 
    SET(CMAKE_CXX_FLAGS "${FLAGS} -rdynamic") 
ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Linux") 

IF (${CMAKE_SYSTEM_NAME} MATCHES "Windows") 
    FILE(GLOB to_remove "${CMAKE_CURRENT_SOURCE_DIR}/src/g2log/crashhandler_unix.cpp") 
ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Windows") 

LIST(REMOVE_ITEM G2LOG ${to_remove}) 

# Build the main library 
ADD_LIBRARY(g2log OBJECT ${G2LOG}) 
ADD_LIBRARY(libzip OBJECT ${LIBZIP}) 
ADD_LIBRARY(core OBJECT ${SOURCES}) 
ADD_LIBRARY(libxml OBJECT ${LIBXML}) 
ADD_LIBRARY(libxslt OBJECT ${LIBXSLT}) 
ADD_LIBRARY(MyProject STATIC $<TARGET_OBJECTS:core> $<TARGET_OBJECTS:libxslt> $<TARGET_OBJECTS:libxml> $<TARGET_OBJECTS:libzip> $<TARGET_OBJECTS:g2log>) 

ADD_EXECUTABLE(MyProjectTests "${CMAKE_CURRENT_SOURCE_DIR}/tests/src/MyProjectTests.cpp") 
TARGET_LINK_LIBRARIES(MyProjectTests MyProject) 
IF (UNIX) 
    TARGET_LINK_LIBRARIES(MyProjectTests "${CMAKE_CURRENT_SOURCE_DIR}/src/somelib/libsomelib.a") 
    TARGET_LINK_LIBRARIES(MyProjectTests "${APP_SERVICES_LIBRARY}") 
    TARGET_LINK_LIBRARIES(MyProjectTests "${CMAKE_CURRENT_SOURCE_DIR}/tests/src/libgtest.a") 

    FIND_PACKAGE(ZLIB REQUIRED) 
    IF (ZLIB_FOUND) 
     INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS}) 
     TARGET_LINK_LIBRARIES(MyProjectTests ${ZLIB_LIBRARIES}) 
    ENDIF(ZLIB_FOUND) 

    IF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 
     # In OSX link to iconv installed by Macports 
     LINK_DIRECTORIES("/opt/local/lib/") 
     TARGET_LINK_LIBRARIES(MyProjectTests iconv) 
    ENDIF(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") 
ENDIF(UNIX) 
+0

그것이 운영자와 파일을 찾을 수 없습니다 말한다. 분명히 Xcode로 드래그 할 수 있지만 CMake가 대신 해줍니다. – ruipacheco

+0

예, 나는 CMake에서 파일을 생성하라는 지시를 받았습니다. 샘플 코드에서 STATIC 명령으로 생성 된 것입니다. – ruipacheco

답변

3

Xcode 생성기를 사용하여 개체 파일로만 구성된 라이브러리를 만들 수 없습니다. documentation에서 :

Some native build systems may not like targets that have only object files, 
so consider adding at least one real source file to any target that 
references $<TARGET_OBJECTS:objlib>. 
+0

거기에, 실행 파일을 만들고 있습니다. – ruipacheco

+0

죄송하지만 내 코드가 귀하의 예와 다른 것 같지 않습니다. 유일한 차이점은 실행 가능 소스 파일에 대한 경로를 만들 때 CMake 변수를 확장한다는 것입니다. – ruipacheco

+0

동일한 내용이 라이브러리 개체에 적용됩니다. – ruipacheco

관련 문제