CMake pybind11 не может создать цель, потому что другая цель с таким именем уже существует, как обойти? - PullRequest
1 голос
/ 24 апреля 2020

У меня есть код, который успешно работает. Это CmakeLists.txt:

cmake_minimum_required(VERSION 3.15) project(rotapro3) set(CMAKE_CXX_STANDARD 14) add_executable(rotapro3 main.cpp):

Я хочу использовать pybind для этого проекта и, следуя инструкциям, добавляю следующие строки:

add_subdirectory(pybind)
pybind11_add_module(rotapro3 main.cpp)

Он успешно запускается, но я получаю сообщение об ошибке:

 add_executable cannot create target "rotapro3" because another target with
  the same name already exists.  The existing target is a module library
  created in source directory "C:/Users/Alex/Dropbox/rotapro3".

Я едва знаю CMake. Как я мог переписать эти строки, чтобы позволить мне использовать add_executable?

ОБНОВЛЕНИЕ:

У меня есть еще один более сложный случай:

    set(SOURCE_FILES
        unit_test/geometry/monomer_test.cpp
        unit_test/geometry/monomer_test.hpp
        unit_test/geometry/polymer_test.cpp
        unit_test/geometry/polymer_test.hpp
        unit_test/geometry/unit_box_test.cpp
        unit_test/geometry/unit_box_test.hpp
        unit_test/geometry/rect_shape_3d_test.cpp
        unit_test/geometry/rect_shape_3d_test.hpp
        src/general/guard.cpp
        src/general/guard.hpp
        src/general/fmt_enum.hpp
        src/general/string_format.cpp
        src/general/string_format.hpp
        src/geometry/monomer.cpp
        src/geometry/monomer.hpp
        src/geometry/polymer.cpp
        src/geometry/polymer.hpp
        src/geometry/unit_box.cpp
        src/geometry/unit_box.hpp
        src/geometry/rect_shape_3d.cpp
        src/geometry/rect_shape_3d.hpp
        )
include_directories(src/general)
include_directories(src/geometry)
include_directories(unit_test/general)
include_directories(unit_test/geometry)

add_executable(
        grapoli_lap ${SOURCE_FILES}
        unit_test/general/string_format_test.cpp
        unit_test/general/string_format_test.hpp
        unit_test/geometry/monomer_test.cpp
        unit_test/geometry/monomer_test.hpp
        unit_test/geometry/polymer_test.cpp
        unit_test/geometry/polymer_test.hpp
        unit_test/geometry/unit_box_test.cpp
        unit_test/geometry/unit_box_test.hpp
        unit_test/geometry/rect_shape_3d_test.cpp
        unit_test/geometry/rect_shape_3d_test.cpp
)

add_subdirectory(pybind11)
pybind11_add_module(grapoli_lap grapoli_lib.cpp)

target_link_libraries(grapoli_lap gtest gtest_main)

Я получаю ту же ошибку .

1 Ответ

1 голос
/ 24 апреля 2020

В CMake у вас не может быть двух целей с одинаковым именем . Поскольку pybind11_add_module() аналогично add_library(), вы должны использовать эту команду для создания цели библиотеки. Вы можете назвать эту цель библиотеки rotapro3. Затем вы можете создать свою исполняемую цель, назвав ее как-нибудь еще (например, rotapro3_exe):

cmake_minimum_required(VERSION 3.15)
project(rotapro3)
set(CMAKE_CXX_STANDARD 14)

add_subdirectory(pybind)
# Create the library rotapro3 target here.
pybind11_add_module(rotapro3 example.cpp)

# Create your executable target (with a different name).
add_executable(rotapro3_exe main.cpp)
...