Как мне получить CMake для компиляции исходного файла, содержащего Boost Local Functions - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь собрать / скомпилировать некоторые Boost Local_functions.

У меня есть файл CMakeLists.txt, в котором собрана библиотека для функций C ++, к которой я хочу получить доступ из Python, но мне также нужны / нужны некоторые BOOST_LOCAL_FUNCTIONSопределяется, но когда я пытаюсь добавить их в свою сборку, я получаю следующую ошибку

In file included from /usr/include/boost/preprocessor   /seq/cat.hpp:18:0,
             from /usr/include/boost/local_function/aux_/symbol.hpp:12,
             from /usr/include/boost/local_function/aux_/macro/code_/result.hpp:11,
             from /usr/include/boost/local_function/aux_/macro/decl.hpp:11,
             from /usr/include/boost/local_function.hpp:13,
             from /home/keith/FreeCAD_Geant4/myg4py/MyFC-G4.cc:1:
/home/keith/FreeCAD_Geant4/myg4py/MyFC-G4.cc:3:5: error:    conflicting declaration ‘boost::scope_exit::detail::declared<> boost_local_function_auxXargsX’

int BOOST_LOCAL_FUNCTION (int x, int y) {// Локальная функция.^ /usr/include/boost/local_function/aux_/macro/decl.hpp:53:9: примечание: предыдущее объявление как 'boost :: scope_exit :: detail :: undeclared boost_local_function_auxXargsX' BOOST_LOCAL_FUNCTION_AUX_DECL_ARGS_V * 100 * * * 100 * * * * * *Файл .txt

cmake_minimum_required(VERSION 3.0)

#set(CMAKE_CXX_STANDARD 14)
find_package(PythonLibs 2 REQUIRED)
#the version of libboost_python
#See https://gitlab.kitware.com/cmake/cmake/issues/16391
if(UNIX)
   set(BOOST_PYTHONLIB python-py36)
else()
#set(BOOST_PYTHONLIB python3)
set(BOOST_PYTHONLIB python2)
endif()

find_package(Geant4 REQUIRED)
find_package(Boost COMPONENTS system python)

include_directories(${Geant4_INCLUDE_DIRS}    ${CMAKE_CURRENT_SOURCE_DIR}/include)

link_directories (${GEANT4_LIBRARY_DIR} ${Boost_LIBRARY_DIRS})

add_library(myg4py SHARED
     myg4py.cc
)

add_library(MyFC-G4 SHARED
      MyFC-G4.cc
)

target_include_directories(myg4py PUBLIC
${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS} ${Geant4_INCLUDE_DIRS}  ${CMAKE_CURRENT_SOURCE_DIR}/include )

target_link_libraries(myg4py
    ${Boost_LIBRARIES} ${PYTHON_LIBRARIES} ${Geant4_LIBRARIES})

MyFC-G4.cc содержит (на данный момент это простой тест)

#include <boost/local_function.hpp> // This library header.

int BOOST_LOCAL_FUNCTION(int x, int y) { // Local function.
      return x + y;
} BOOST_LOCAL_FUNCTION_NAME(add)

1 Ответ

0 голосов
/ 20 января 2019

Ваша функция не локальная , она определена в области имен. Если это то, что вам нужно, используйте вместо этого обычную функцию. BOOST_LOCAL_FUNCTION предназначен для объявления функций, которые являются локальными для области действия другой функции.

Измените код в MyFC-G4.cc следующим образом, и он должен скомпилироваться

#include <boost/local_function.hpp> // This library header.

void foo()
{
  int BOOST_LOCAL_FUNCTION(int x, int y) { // Local function.
        return x + y;
  } BOOST_LOCAL_FUNCTION_NAME(add)

  // You can only make use of add within foo
}
...