项目重组后的未知类型名称

时间:2017-09-02 16:01:31

标签: c cmake

我目前正在重新组织一个c项目以使用cmake作为构建生成器。我使用Cmake-Init项目(https://github.com/cginternals/cmake-init)作为项目布局的模板。

我认为我已经完成了组织部分,cmake生成部分到目前为止成功,但编译失败了。编译器抛出此错误:

In file included from /home/simon/Documents/buffer/janus_oss_transition/source/ibis/include/ibis/ngramLM.h:48:0,
             from /home/simon/Documents/buffer/janus_oss_transition/source/base/include/base/list.h:46,
             from /home/simon/Documents/buffer/janus_oss_transition/source/stc/include/stc/cbn_parmat.h:45,
             from /home/simon/Documents/buffer/janus_oss_transition/source/stc/include/stc/cbnew.h:53,
             from /home/simon/Documents/buffer/janus_oss_transition/source/stc/source/cbn_common.c:40:
/home/simon/Documents/buffer/janus_oss_transition/source/base/include/base/array.h:76:55: error: unknown type name ‘List’
 extern int iarrayGetListItf( IArray* IA, char* value, List* L);
                                                       ^

array.h只有一个包含:#include "base/list.h"

list.h定义了typedef struct List,如下所示:

#define LIST(T) \
{ \
 \
 T*              itemA;      /* array of items                      */ \
 int             itemN;      /* number of items in the list         */ \
 int             itemMax;    /* max. number of items in the list    */ \
 int             itemSize;   /* size of the indivual items          */ \
 int             itemSizeCP; \
 int             allocN;     /* number of allocated records in dsA  */ \
 int             blkSize;    /* block size for allocation           */ \
 int             compress;   /* compress list when deleting items   */ \
\
 TypeInfo*       typeInfo;   /* pointer to item type information    */ \
\
 int             sorted;     /* is array sorted                     */ \
 ListCmpFn*      sortCmp;    /* compare two items in the list       */ \
 int*            sortXA;     /* sorted index array                  */ \
\
 int*            hashTable; \
 HashRec*        hashXA; \
 int             hashSizeX;  /* hash size as index of hashPrimes    */ \
 int             hashSizeY;  /* hash size = hashPrimes(hashSIzeX)   */ \
 HashKeyFn*      hashKey; \
 HashCmpFn*      hashCmp; \
 ClientData      DataHolder;\
\
 ListItemInit*   init;       /* item initialization function        */ \
 ListItemDeinit* deinit; \
 ListItemLinkN*  links; \
\
}

typedef struct LIST(char*) List;

这是“base”文件夹的CMakeLists,包含数组和列表:

# 
# External dependencies
# 

# find_package(THIRDPARTY REQUIRED)


# 
# Library name and options
# 

# Target name
set(target base)

# Exit here if required dependencies are not met
message(STATUS "Lib ${target}")

# Set API export file and macro
string(MAKE_C_IDENTIFIER ${target} target_id)
string(TOUPPER ${target_id} target_id)
set(feature_file         "include/${target}/${target}_features.h")
set(export_file          "include/${target}/${target}_export.h")
set(template_export_file "include/${target}/${target}_api.h")
set(export_macro         "${target_id}_API")


# 
# Sources
# 

set(include_path "${CMAKE_CURRENT_SOURCE_DIR}/include/${target}")
set(source_path  "${CMAKE_CURRENT_SOURCE_DIR}/source")

set(headers
    ${include_path}/array.h
    ${include_path}/common.h
    ${include_path}/dbase.h
    ${include_path}/ffmat.h
    ${include_path}/list.h
    ${include_path}/mach_ind_io.h
    ${include_path}/matrix.h
)

set(sources
    ${source_path}/array.c
    ${source_path}/common.c
    ${source_path}/dbase.c
    ${source_path}/ffmat.c
    ${source_path}/list.c
    ${source_path}/mach_ind_io.c
    ${source_path}/matrix.c
    ${source_path}/matrix-io.c
    ${source_path}/melscale.c

)

# Group source files
set(header_group "Header Files (API)")
set(source_group "Source Files")
source_group_by_path(${include_path} "\\\\.h$|\\\\.hpp$" 
    ${header_group} ${headers})
source_group_by_path(${source_path}  "\\\\.cpp$|\\\\.c$|\\\\.h$|\\\\.hpp$" 
    ${source_group} ${sources})


# 
# Create library
# 

# Build library
add_library(${target}
    ${sources}
    ${headers}
)


# Create namespaced alias
add_library(${META_PROJECT_NAME}::${target} ALIAS ${target})

# Export library for downstream projects
export(TARGETS ${target} NAMESPACE ${META_PROJECT_NAME}:: FILE ${PROJECT_BINARY_DIR}/cmake/${target}/${target}-export.cmake)

# Create feature detection header
# Compilers: https://cmake.org/cmake/help/v3.1/variable/CMAKE_LANG_COMPILER_ID.html#variable:CMAKE_%3CLANG%3E_COMPILER_ID
# Feature: https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html

# Check for availability of module; use pre-generated version if not found
if (WriterCompilerDetectionHeaderFound)
    write_compiler_detection_header(
        FILE ${feature_file}
        PREFIX ${target_id}
        COMPILERS AppleClang Clang GNU MSVC
        FEATURES cxx_alignas cxx_alignof cxx_constexpr cxx_final cxx_noexcept cxx_nullptr cxx_sizeof_member cxx_thread_local
        VERSION 3.2
    )
else()
    file(
        COPY ${PROJECT_SOURCE_DIR}/source/codegeneration/${target}_features.h
        DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include/${target}
        USE_SOURCE_PERMISSIONS
    )
endif()


# 
# Project options
# 

set_target_properties(${target}
    PROPERTIES
    ${DEFAULT_PROJECT_OPTIONS}
    FOLDER "${IDE_FOLDER}"
    VERSION ${META_VERSION}
    SOVERSION ${META_VERSION_MAJOR}
)


# 
# Include directories
# 

target_include_directories(${target}
    PRIVATE
    ${PROJECT_BINARY_DIR}/source/include
    ${CMAKE_CURRENT_SOURCE_DIR}/include
    ${CMAKE_CURRENT_BINARY_DIR}/include

    PUBLIC
    ${DEFAULT_INCLUDE_DIRECTORIES}

    INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
    $<INSTALL_INTERFACE:include>
)


# 
# Libraries
# 

target_link_libraries(${target}
    PRIVATE
    ${DEFAULT_LIBRARIES}
    ${META_PROJECT_NAME}::base
    ${META_PROJECT_NAME}::features
    ${META_PROJECT_NAME}::hmm
    ${META_PROJECT_NAME}::ibis
    ${META_PROJECT_NAME}::itf
    ${META_PROJECT_NAME}::models
    ${META_PROJECT_NAME}::stc
)


# 
# Compile definitions
# 

target_compile_definitions(${target}
    PRIVATE

    PUBLIC
    $<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:${target_id}_STATIC_DEFINE>
    ${DEFAULT_COMPILE_DEFINITIONS}

    INTERFACE
)


# 
# Compile options
# 

target_compile_options(${target}
    PRIVATE

    PUBLIC
    ${DEFAULT_COMPILE_OPTIONS}

    INTERFACE
)


# 
# Linker options
# 

target_link_libraries(${target}
    PRIVATE

    PUBLIC
    ${DEFAULT_LINKER_OPTIONS}

    INTERFACE
)


#
# Target Health
#

perform_health_checks(
    ${target}
    ${sources}
    ${headers}
)


# 
# Deployment
# 

# Library
install(TARGETS ${target}
    EXPORT  "${target}-export"            COMPONENT dev
    RUNTIME DESTINATION ${INSTALL_BIN}    COMPONENT runtime
    LIBRARY DESTINATION ${INSTALL_SHARED} COMPONENT runtime
    ARCHIVE DESTINATION ${INSTALL_LIB}    COMPONENT dev
)

# Header files
install(DIRECTORY
    ${CMAKE_CURRENT_SOURCE_DIR}/include/${target} DESTINATION ${INSTALL_INCLUDE}
    COMPONENT dev
)

# Generated header files
install(DIRECTORY
    ${CMAKE_CURRENT_BINARY_DIR}/include/${target} DESTINATION ${INSTALL_INCLUDE}
    COMPONENT dev
)

# CMake config
install(EXPORT ${target}-export
    NAMESPACE   ${META_PROJECT_NAME}::
    DESTINATION ${INSTALL_CMAKE}/${target}
    COMPONENT   dev
)

这是我的目标的CMakeLists。我正在努力建立janus。

# 
# External dependencies
# 

# find_package(THIRDPARTY REQUIRED)


# 
# Executable name and options
# 

# Target name
set(target janus)
set(libTarget libjanus)

# Exit here if required dependencies are not met
message(STATUS "Example ${target}")



# 
# Sources
# 

set(sources
    janusInit.c
    janusMain.c
)

add_library(${libTarget} STATIC ${sources})
set_target_properties(${libTarget} PROPERTIES OUTPUT_NAME janus)
target_compile_definitions(${libTarget} PUBLIC -DIBIS)  
target_include_directories(${libTarget}
    PRIVATE
    ${DEFAULT_INCLUDE_DIRECTORIES}
    ${PROJECT_BINARY_DIR}/source/include
)
target_link_libraries(${libTarget}
    PRIVATE
    ${DEFAULT_LIBRARIES}
    ${META_PROJECT_NAME}::base
    ${META_PROJECT_NAME}::features
    ${META_PROJECT_NAME}::hmm
    ${META_PROJECT_NAME}::ibis
    ${META_PROJECT_NAME}::itf
    ${META_PROJECT_NAME}::models
    ${META_PROJECT_NAME}::stc
)
target_compile_definitions(${libTarget}
    PRIVATE
    ${DEFAULT_COMPILE_DEFINITIONS}
)

# 
# Create executable
# 

# Build executable
add_executable(${target}

    ${sources}
)


# Create namespaced alias
add_executable(${META_PROJECT_NAME}::${target} ALIAS ${target})


# 
# Project options
# 

set_target_properties(${target}
    PROPERTIES
    ${DEFAULT_PROJECT_OPTIONS}
    FOLDER "${IDE_FOLDER}"
)


# 
# Include directories
# 

target_include_directories(${target}
    PRIVATE
    ${DEFAULT_INCLUDE_DIRECTORIES}
    ${PROJECT_BINARY_DIR}/source/include
)


# 
# Libraries
# 

target_link_libraries(${target}
    PRIVATE
    ${DEFAULT_LIBRARIES}
    ${META_PROJECT_NAME}::base
    ${META_PROJECT_NAME}::features
    ${META_PROJECT_NAME}::hmm
    ${META_PROJECT_NAME}::ibis
    ${META_PROJECT_NAME}::itf
    ${META_PROJECT_NAME}::models
    ${META_PROJECT_NAME}::stc
)


# 
# Compile definitions
# 

target_compile_definitions(${target}
    PRIVATE
    ${DEFAULT_COMPILE_DEFINITIONS}
    -DIBIS
)

if(NOT USE_TK)
        target_compile_definitions(${target} PUBLIC -DDISABLE_TK)
        target_compile_definitions(${libTarget} PUBLIC -DDISABLE_TK)
endif()


# 
# Compile options
# 

target_compile_options(${target}
    PRIVATE
    ${DEFAULT_COMPILE_OPTIONS}
)


# 
# Linker options
# 

target_link_libraries(${target}
    PRIVATE
    ${DEFAULT_LINKER_OPTIONS}
)


#
# Target Health
#

perform_health_checks(
    ${target}
    ${sources}
)


# 
# Deployment
# 

# Executable
install(TARGETS ${target}
    RUNTIME DESTINATION ${INSTALL_BIN} COMPONENT examples
    BUNDLE  DESTINATION ${INSTALL_BIN} COMPONENT examples
)

我可能搞砸了cmake中包含的内容吗?这些文件位于同一个文件夹中。

感谢您的帮助 西蒙

编辑:
添加了CMakeLists。

1 个答案:

答案 0 :(得分:0)

我发现循环包含似乎是错误的根源。