CMake包含自定义目标类型的目录(_D)

bogh5gae  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(177)

我有一个带有.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的生成器,但它是相当实验性的,在我的情况下不工作。

3bygqnnd

3bygqnnd1#

我也遇到过类似的问题,我需要为自定义目标提供include目录。我的解决方案并不高明,但似乎解决了手头的问题。我获得了include目录中的路径,并将它们格式化为编译器所需的输入(在本例中为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](https://www.codesynthesis.com/products/odb/download.xhtml)

gfttwv5a

gfttwv5a2#

如果有人有兴趣让这个工作,这里有一个简单的食谱,这是类似于我提出的here
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>"
    )

1.最后,为您需要的任何目标配置模板:

configure_file(
    "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.vcxproj.user"
    "${CMAKE_CURRENT_BINARY_DIR}/${my_target}.vcxproj.user"
    @ONLY
)

模板名称,模板目录,所有以my_开头的变量,甚至步骤都可以用几种方式修改。最后,唯一重要的是,为您的自定义目标存在包含上述xml内容的xml文件${CMAKE_CURRENT_BINARY_DIR}/${my_target}.vcxproj.user

相关问题