【问题标题】:CMakeLists add_library according to optionCMakeLists add_library 根据选项
【发布时间】:2021-08-09 12:30:55
【问题描述】:

我正在尝试构建一个将在不同类型的目标机器上应用的项目(c++ 代码文件),并且我正在尝试根据机器类型包含 cpp 文件,为此我在 CMakeLists 文件中创建了选项以便使用它们是否包含 cpp 文件。

option (MACHINE1 "MACHINE1 DESCRIPTION" OFF)
option (MACHINE2 "MACHINE1 DESCRIPTION" OFF)
...
...
...
add_library (SO_LIBRARY
         SHARED FILE1.cpp
if (MACHINE1)
         FILE2.cpp
endif ()
if (MACHINE2)
         FILE3.cpp
endif ()
         )
...

我已经有一个链接的 bitbake 文件,我可以在其中设置这些选项的开启和关闭,这不是问题,问题是 CMakeFile 不接受这种类型的写入:

| CMake Error at CMakeLists.txt:52 (add_library):
|   Cannot find source file:
|
|     if
|
|   Tried extensions .c .C .c++ .cc .cpp .cxx .cu .m .M .mm .h .hh .h++ .hm
|   .hpp .hxx .in .txx
|
|
| CMake Error at CMakeLists.txt:52 (add_library):
|   No SOURCES given to target: SO_LIBRARY

有什么办法吗?

非常感谢。

【问题讨论】:

    标签: c++ makefile cmakelists-options


    【解决方案1】:

    尝试以下方法,根据机器的类型,将文件名分配给变量,然后使用它添加到源中。

    if(MACHINE1)
    set(SOURCEFILES "file1.cpp");
    if(MACHINE2)
    set(SOURCEFILES "file2.cpp");
    if (MACHINE3)
    set(SOURCEFILES "file3.cpp");
    

    现在添加文件以添加库

    add_library (SO_LIBRARY
         SHARED ${SOURCEFILES})
    

    【讨论】:

      【解决方案2】:

      我会按照这些思路做一些事情,而不是option

      set(COMMON_SRC File1.cpp)
      set(MACHINE1_SRC File2.cpp)
      set(MACHINE1_SRC File3.cpp)
      
      if(MACHINE1)
        add_library (SO_LIBRARY SHARED ${COMMON_SRC} ${MACHINE1_SRC_SRC}
      elseif(MACHINE2)
        add_library (SO_LIBRARY SHARED ${COMMON_SRC} ${MACHINE2_SRC_SRC}
      else()
        ...
      endif()
      

      【讨论】:

        【解决方案3】:

        您的目标是创建一个list 来源,其内容将取决于某些条件。

        从定义一个变量开始,把所有常见的源文件放在那里:

        set(SOURCES
            file_common_1.cpp
            file_common_2.cpp
        )
        

        然后,APPEND 元素到SOURCES 根据条件列出:

        if(OPTION1)
            list(APPEND SOURCES file_specific_machine1.cpp)
        endif()
        
        if(OPTION2)
            list(APPEND SOURCES file_specific_machine2.cpp)
        endif()
        

        最后,使用SOURCES 列表创建一个库:

        add_library(SO_LIBRARY ${SOURCES})
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-11
          • 2019-11-19
          • 2013-10-10
          • 2010-12-14
          • 2018-04-28
          相关资源
          最近更新 更多