我有一个带有 .cpp 和 .h 源文件的自定义目标。正常情况下,这些文件包含其他头文件。我想添加一个目录来查找头文件。
到目前为止,这听起来可能很简单,但这里有一个转折点。我正在使用自定义目标和自定义命令来编译和链接程序。实际编译器需要另一种类型的项目文件,该文件与 CMake 不兼容。
如果我尝试将包含目录添加到当前目标,则会出现以下错误:
target_include_directories called with non-compliant target type.
Run Code Online (Sandbox Code Playgroud)
我认为这可能的原因是您可以在我从 CMake 创建的 Visual Studio 项目中添加头文件查找路径。我不想这样做,因为它不持久,我团队中的每个人也都必须这样做。更糟糕的是,我必须向他们解释……(颤抖)
编辑:
为了回答评论,我正在生成 Visual Studio 2017 项目文件。我的自定义目标命令只是:
add_custom_target(APP
DEPENDS ${APP_DEPENDENCIES}
SOURCES ${APP_DEPENDENCIES}
)
Run Code Online (Sandbox Code Playgroud)
我的自定义命令是:
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}
)
Run Code Online (Sandbox Code Playgroud)
我知道 CMake 有一个 GHS MULTI 生成器,但它是相当实验性的,在我的情况下不起作用。
如果有人有兴趣让它发挥作用,这里有一个简单的方法,与我在这里提出的方法类似。
list(APPEND MY_INCLUDE_PATHS "${my_helpers_include}")
list(APPEND MY_INCLUDE_PATHS "${my_project_include}")
# ...
Run Code Online (Sandbox Code Playgroud)
${CMAKE_PROJECT_NAME}.vcxproj.user为 C/C++创建一个简单的模板 xml 文件${CMAKE_BINARY_DIR}: 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>"
)
Run Code Online (Sandbox Code Playgroud)
configure_file(
"${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.vcxproj.user"
"${CMAKE_CURRENT_BINARY_DIR}/${my_target}.vcxproj.user"
@ONLY
)
Run Code Online (Sandbox Code Playgroud)
模板名称、模板目录、所有以 开头的变量my_甚至步骤都可以通过多种方式进行修改。最后,重要的是${CMAKE_CURRENT_BINARY_DIR}/${my_target}.vcxproj.user您的自定义目标存在 xml 文件以及上面的 xml 内容。