CMake为自定义目标类型包含目录

7
我有一个包含.cpp和.h源文件的自定义目标。像往常一样,这些文件包含其他头文件。我想添加一个目录以便从中查找头文件。
到目前为止,这可能听起来很简单,但是问题在于我正在使用自定义目标和自定义命令来编译和链接程序。实际编译器需要另一种类型的项目文件,与CMake不兼容。
如果我尝试将包含目录添加到当前目标,就会收到以下错误提示:
target_include_directories called with non-compliant target type.

我认为这是可能的原因是,您可以在我从CMake创建的Visual Studio项目中添加头文件查找路径。但我不想这样做,因为它不是持久性的,我的团队成员也必须这样做。更糟糕的是,我必须向他们解释。(打颤)

编辑:

回答评论,我正在生成Visual Studio 2017项目文件。我的自定义目标命令只是:

add_custom_target(APP
DEPENDS ${APP_DEPENDENCIES}
SOURCES ${APP_DEPENDENCIES}
)

我的自定义命令是:

add_custom_command(
OUTPUT "${LIB_COMPILE_DIR}/libAPP.a"
DEPENDS ${LIB_COMPILE_SRCS}
COMMAND gbuild -top ${LIB_COMPILE_DIR}/App.gpj
WORKING_DIRECTORY ${LIB_COMPILE_DIR}
)

我知道CMake有一个GHS MULTI生成器,但它还处于实验阶段,无法在我的情况下使用。


你尝试过使用原生的include_directories吗? - Steve Lorimer
是的,但我猜它只会将包含目录添加到有效目标中。可惜我的目标不在其中。 - 0xbaadf00d
你能分享一下你的自定义目标和自定义命令吗?你用什么来构建这个?你能使用VERBOSE=1来显示编译器正在传递什么吗? - Steve Lorimer
这个有进展了吗? - Dalbenn
嗯,有点可以,也有点不行。似乎没有直接实现这个的方法。我认为可以通过脚本将包含路径添加到生成的项目文件中。我没有尝试过这个方法。 - 0xbaadf00d
2个回答

2

如果有人对使这个工作感兴趣,这里有一个简单的配方,类似于我提出的这里

  1. 定义一个变量来存储所需的包含路径(示例):
list(APPEND MY_INCLUDE_PATHS "${my_helpers_include}")
list(APPEND MY_INCLUDE_PATHS "${my_project_include}")
# ...
  1. ${CMAKE_BINARY_DIR}中为C/C++创建一个简单的${CMAKE_PROJECT_NAME}.vcxproj.user模板xml文件:
    file(
        WRITE "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.vcxproj.user"
"<?xml version=\"1.0\" encoding=\"utf-8\"?>
<Project ToolsVersion=\"Current\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">
  <PropertyGroup>
    <IncludePath>$(IncludePath);@MY_INCLUDE_PATHS@</IncludePath>
  </PropertyGroup>
</Project>"
    )

最后,根据您的需要配置模板。
configure_file(
    "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.vcxproj.user"
    "${CMAKE_CURRENT_BINARY_DIR}/${my_target}.vcxproj.user"
    @ONLY
)

模板名称、模板目录、所有以my_开头的变量,甚至步骤都可以通过多种方式进行修改。最终只要确保xml文件${CMAKE_CURRENT_BINARY_DIR}/${my_target}.vcxproj.user存在于您的自定义目标中,并包含上述的xml内容即可。


我有点记得以前在做这个项目时做过类似的事情。 - 0xbaadf00d
这个功能很好,但你需要转义那些双引号以便生成正确的XML文档。请@P.B.更新答案。谢谢。 - m1lhaus
感谢您发现了这个问题,@m1lhaus。我已经更新了答案,但是目前无法直接在CMake中测试它。-希望我已经找到所有缺失的转义符。 - P. B.

1

我遇到了类似的问题,因为我需要向自定义目标提供包含目录。我的解决方案并不是很出色,但它似乎能解决眼前的问题。我获取了包含目录中的路径,并将其格式化为我的编译器所需的输入(在这种情况下是ODB[1])。

    get_directory_property(dirs INCLUDE_DIRECTORIES)
    set(global_includes "")
    foreach(dir IN LISTS dirs)
        set(global_includes ${global_includes} -I ${dir})
    endforeach()

我随后在自定义目标的命令中使用了${global_includes}。我想转向新的target_include_directories世界,但在这种情况下还没有成功。

[1] https://www.codesynthesis.com/products/odb/download.xhtml


1
非常抱歉我的问题表述不够清晰,我应该说我想给Visual Studio提供路径,以便Intellisense可以正常工作。编译步骤并不是问题,只是因为Visual Studio找不到头文件,几乎每一行都被标记为红色。我进行了自己的研究,并发现这在CMake中是不可能的,除非我编写一个脚本,在CMake生成Visual Studio项目文件后将包含路径插入其中。这不是一个简单的问题,它比起一开始看起来要复杂得多。 - 0xbaadf00d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接