我正在编写一个游戏引擎,我有一个名为的目录thirdparty
,其中放置了我的引擎使用的所有外部库:
thirdparty/...
/zlib
/freetype2
/SDL2
/...
Run Code Online (Sandbox Code Playgroud)
因此,引擎目录结构如下所示:
engine/actors
engine/memory_allocator
engine/renderer
engine/...
engine/thirdparty
engine/thirdparty/CMakeLists.txt
engine/CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
的engine/CMakeLists.txt
:
cmake_minimum_required (VERSION 3.2)
project(Engine)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -fvisibility=hidden -fvisibility-inlines-hidden -Wall -Werror")
# Include build directory to be able to include generated files:
set(CMAKE_INCLUDE_CURRENT_DIR ON)
file(GLOB GLAD_SOURCES thirdparty/glad/src/glad.c)
file(GLOB ACTOR_SOURCES actors/*.cpp)
file(GLOB LOGIC_SOURCES logic/*.cpp)
file(GLOB UI_SOURCES ui/*.cpp)
set(SOURCES ${GLAD_SOURCES}
${ACTOR_SOURCES}
${LOGIC_SOURCES}
${UI_SOURCES})
add_library(engine SHARED ${SOURCES})
include_directories(thirdparty/glm/)
include_directories(thirdparty/glad/include)
include_directories(thirdparty/tinyxml2/)
include_directories(thirdparty/zlib/)
include_directories(thirdparty/sdl2/SDL2-2.0.5/)
include_directories(./)
add_subdirectory(../../thirdparty thirdparty)
target_link_libraries(engine SDL2)
target_link_libraries(engine tinyxml2)
target_link_libraries(engine zlib)
Run Code Online (Sandbox Code Playgroud)
的engine/thirdparty/CMakeLists.txt
:
set(BUILD_CPU_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_EXTRAS OFF CACHE BOOL "" FORCE)
set(BUILD_BULLET2_DEMOS OFF CACHE BOOL "" FORCE)
set(BUILD_UNIT_TESTS OFF CACHE BOOL "" FORCE)
set(FREETYPE_NO_DIST OFF CACHE BOOL "" FORCE)
set(OLD_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "")
# add_subdirectory(bullet3)
set(CMAKE_CXX_FLAGS "${OLD_CXX_FLAGS}")
add_subdirectory(freetype2)
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
add_subdirectory(tinyxml2)
add_subdirectory(sdl2/SDL2-2.0.5/)
add_subdirectory(zlib)
Run Code Online (Sandbox Code Playgroud)
所以,主引擎CMakeLists.txt
在引擎源的根目录下,引擎根目录下还有一个CMakeLists.txt
用于构建第三方库的thirdparty
子目录。
问题是第三方的一些子目录,例如SDL2和zlib包含相同的目标名称,添加了via等add_custom_target
,因此CMake无法生成,Makefile
因为这个命名冲突:
zlib 的 CMakeLists.txt(最后):
# uninstall target
if(NOT TARGET uninstall)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()
Run Code Online (Sandbox Code Playgroud)
SDL2 的 CMakeLists.txt:
##### Uninstall target #####
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
Run Code Online (Sandbox Code Playgroud)
所以最终的错误是:
CMake Error at /home/user/engine/thirdparty/sdl2/SDL2-2.0.5/CMakeLists.txt:1624 (add_custom_target):
add_custom_target cannot create target "uninstall" because another target
with the same name already exists. The existing target is a custom target
created in source directory
"/home/user/engine/thirdparty/zlib". See
documentation for policy CMP0002 for more details.
Run Code Online (Sandbox Code Playgroud)
有没有什么办法解决这一问题?也许,有一种方法可以通过添加任何前缀来重命名这些目标,使它们永远不会发生冲突?
这主要取决于您的目标发电机。对它们施加限制的解决方案是使用ALLOW_DUPLICATE_CUSTOM_TARGETS
.
从文档来看:
允许创建重复的自定义目标。
无论如何,它仅适用于 Makefile 生成器:
对于只关心 Makefile 生成器而不希望支持 Xcode 或 VS IDE 生成器的项目,可以将此属性设置为 true 以允许重复的自定义目标。
否则,请考虑不要直接将依赖项打包到项目中,并使用周围的其他工具(例如Find*
)来使它们与目标系统上的正确路径保持一致。
归档时间: |
|
查看次数: |
2302 次 |
最近记录: |