【问题标题】:How to properly use file GLOB?如何正确使用文件 GLOB?
【发布时间】:2016-11-05 14:15:36
【问题描述】:

我正在尝试使用 GLOB_RECURSE 来指定我的源文件和头文件。目前,我的静态库的 CMakeLists.txt 是:

project(LinearSystemLib)

file(GLOB_RECURSE ${PROJECT_NAME}_headers ${PROJECT_SOURCE_DIR}/*.h)

file(GLOB_RECURSE ${PROJECT_NAME}_sources ${PROJECT_SOURCE_DIR}/*.cpp)

add_library(

${PROJECT_NAME} STATIC ${${PROJECT_NAME}_headers} 

${${PROJECT_NAME}_sources}

)

install(

    TARGETS ${PROJECT_NAME}

    LIBRARY DESTINATION libs

    ARCHIVE DESTINATION archives

)

库目录如下所示:

LinearSystemLib

           CMakeLists.txt

           source

                LinearSystemLib.cpp

            include

                LinearSystemLib.h

当我运行命令cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug(在构建目录中)时,一切正常。然而,命令make 会显示以下内容:

/home/felipe/Documents/Dados/SINMEC/Eclipse/LinearSystemLib/source/LinearSystemLib.cpp:1:29: fatal error: LinearSystemLib.h: No such file or directory

我的 CMakeLists 错了吗?我不想设置按名称指定源文件和头文件。我不容易找到有关 glob_recurse 的信息。

我可以通过按名称列出源文件和头文件来使其工作。但是,它必须使用 glob_recurse 或 glob 来完成。

【问题讨论】:

标签: c++ makefile cmake


【解决方案1】:

我解决了我的问题,LinearSystemLib 目录如下所示:

LinearSystemLib

       CMakeLists.txt

       source

            LinearSystemLib.cpp

        include

            LinearSystemLib.h

CMakeLists.txt 包含:

project(LinearSystemLib)


#INCLUDE DIRECTORIES
include_directories(${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/include)


#SEARCH FOR .CPP AND .H FILES
file(GLOB ${PROJECT_NAME}_headers ${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/include/*.h)
file(GLOB ${PROJECT_NAME}_sources ${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/source/*.cpp)


#ADD LIBRARY
add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_sources})


#DEFINE OUTPUT LOCATION
install(
    TARGETS ${PROJECT_NAME}
    ARCHIVE DESTINATION static_libs
)

您实际上不需要使用 GLOB 添加 .h/.hpp 文件。我这样做是因为否则,Visual Studio(或 CodeBlocks)不会在项目菜单上创建“头文件”文件夹。

我没有正确指定 GLOB 找到文件的路径。

${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/source/ 

【讨论】:

  • 您能否详细说明为什么您需要在source 子目录中添加额外的CMakeLists.txt 文件?我好像不一般。您可以在主 CMakeLists.txt 文件中添加一个 include_directories(include) 调用。相对路径就足够了,CMake会自动给CMAKE_CURRENT_SOURCE_DIR加前缀。
  • 您好,我在这个项目中有几个包含目录。我不知道你的建议是否仍然适用。
  • 其实源子目录下的CMakeLists.txt是不需要的。您可以在项目目录中只有一个 .txt 文件。
【解决方案2】:

你需要添加

target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR})

所以正确的-I 参数被添加到您的编译步骤。使用make VERBOSE=1 可以准确查看正在执行的命令。

【讨论】:

  • 你好。我试图包括在内,但是我得到了同样的错误。你有可以分享的 CMakeLists.txt 文件吗?
  • 我没有一个可以正确构建您的代码。如果您运行make VERBOSE=1,这应该可以帮助您了解正在使用的-I 参数以及如何调整target_include_directories 命令以使其正常工作。如果没有,您需要将代码发布到某个地方,以便有人可以查看它并查看到底出了什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2011-01-12
相关资源
最近更新 更多