c++ - CMake 生成的 Xcode 项目无法编译

标签 c++ xcode cmake static-libraries googletest

我有一个在 Mac 上开发的 C++ 项目。我可以通过命令行使用 ninja 或 gmake 毫无问题地构建它,但是一旦我生成 Xcode 项目,它就会失败。

项目本身是一个静态库,链接到运行 googletest 的命令行应用程序。

我得到的错误是,在构建最终可执行文件时,Xcode 说找不到静态库。这是我的 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)

最佳答案

您不能使用 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>.

关于c++ - CMake 生成的 Xcode 项目无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24078873/

相关文章:

c++ - 为不受支持的平台调整 Boost 线程/进程

c++ - CMake:什么是可能的目标源类型,它们可以扩展吗?

ios - 约束在当前 ViewController 中无法正常工作

ios - xcode 上的 chartboost 集成错误

ios - 如何设置 UIPickerView 的默认值

c - 在 Windows 中将 Graphviz 与 Clion 结合使用

c++ - CMake 在 Linux 中构建共享对象 .so 文件

c++ - 强制执行不同的 C++ 模板参数

c++ - 如果通过单击任务栏按钮最小化程序,SW_SHOWNOACTIVATE 不起作用

c++ - 如何安装第三方库