C++ 犰狳分割错误+;更改g+时进行+;编译器标记为-std=c++;11

C++ 犰狳分割错误+;更改g+时进行+;编译器标记为-std=c++;11,c++,c++11,cmake,armadillo,C++,C++11,Cmake,Armadillo,项目布局 ├── CMakeLists.txt ├── README.md ├── cppml.pc.in ├── examples │   ├── AccuracyScoreEx.cpp │   └── CMakeLists.txt ├── include │   └── cppml │   ├── Prerequisites.h │   └── metrics │   └── AccuracyScore.h └── src ├── CMakeLists

项目布局

├── CMakeLists.txt
├── README.md
├── cppml.pc.in
├── examples
│   ├── AccuracyScoreEx.cpp
│   └── CMakeLists.txt
├── include
│   └── cppml
│       ├── Prerequisites.h
│       └── metrics
│           └── AccuracyScore.h
└── src
    ├── CMakeLists.txt
    └── metrics
        └── AccuracyScore.cpp
根目录的内容
CMakeLists.txt

cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(cppml VERSION 1.0.1 LANGUAGES CXX)
include(GNUInstallDirs)

find_package(Armadillo REQUIRED)

configure_file(cppml.pc.in cppml.pc @ONLY)

add_subdirectory(src)
add_subdirectory(examples)
#add_subdirectory(tests)
# set source files
set (sources
  metrics/AccuracyScore.cpp
)

# define library targets
add_library(cppml SHARED
  ${sources}
)

# target properties
set_target_properties(cppml PROPERTIES
 VERSION ${PROJECT_VERSION}
 SOVERSION 1
 CXX_VISIBILITY_PRESET hidden
)

# define headers for this lib. PUBLIC headers are used for compiling
# the library, and will be added to user's build path.
target_include_directories(cppml PUBLIC
  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>
  PRIVATE ${PROJECT_SOURCE_DIR}/src
)

# Link with externel libs
target_link_libraries(cppml ${ARMADILLO_LIBRARIES})

# target_compile_features(cppml
#   PUBLIC
#     cxx_std_11 #XXX: PROBLEM HERE!
# )

# Install
install(TARGETS cppml
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/ 
  DESTINATION     ${CMAKE_INSTALL_INCLUDEDIR}
)

install(FILES ${CMAKE_BINARY_DIR}/cppml.pc
  DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig
)
src/CMakeLists.txt的内容

cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
project(cppml VERSION 1.0.1 LANGUAGES CXX)
include(GNUInstallDirs)

find_package(Armadillo REQUIRED)

configure_file(cppml.pc.in cppml.pc @ONLY)

add_subdirectory(src)
add_subdirectory(examples)
#add_subdirectory(tests)
# set source files
set (sources
  metrics/AccuracyScore.cpp
)

# define library targets
add_library(cppml SHARED
  ${sources}
)

# target properties
set_target_properties(cppml PROPERTIES
 VERSION ${PROJECT_VERSION}
 SOVERSION 1
 CXX_VISIBILITY_PRESET hidden
)

# define headers for this lib. PUBLIC headers are used for compiling
# the library, and will be added to user's build path.
target_include_directories(cppml PUBLIC
  $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>
  PRIVATE ${PROJECT_SOURCE_DIR}/src
)

# Link with externel libs
target_link_libraries(cppml ${ARMADILLO_LIBRARIES})

# target_compile_features(cppml
#   PUBLIC
#     cxx_std_11 #XXX: PROBLEM HERE!
# )

# Install
install(TARGETS cppml
  LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)

install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/ 
  DESTINATION     ${CMAKE_INSTALL_INCLUDEDIR}
)

install(FILES ${CMAKE_BINARY_DIR}/cppml.pc
  DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig
)
但不是这个:

g++ -std=c++11 -o AccuracyScoreEx AccuracyScoreEx.cpp -lcppml
./AccuracyScoreEx
Segmentation fault: 11
以下是源代码:

先决条件.h

#ifndef INCLUDE_CPPML_PREREQUISITES_H_
#define INCLUDE_CPPML_PREREQUISITES_H_

//  armadillo
#include <armadillo>

#endif  // INCLUDE_CPPML_PREREQUISITES_H_
#ifndef INCLUDE_CPPML_METRICS_ACCURACYSCORE_H_
#define INCLUDE_CPPML_METRICS_ACCURACYSCORE_H_

#include "cppml/Prerequisites.h"

namespace cppml {
namespace metrics {

extern "C" double accuracy_score(const arma::ivec &y_true,
                    const arma::ivec &y_pred,
                    const bool normalize = true,
                    const arma::vec &sample_weight = arma::vec());

}  // namespace metrics
}  // namespace cppml

#endif  // INCLUDE_CPPML_METRICS_ACCURACYSCORE_H_
AccuracyScore.cpp

#include "cppml/metrics/AccuracyScore.h"

#define EXPORT __attribute__((visibility("default")))

namespace cppml {
namespace metrics {

EXPORT
double accuracy_score(const arma::ivec &y_true,
                  const arma::ivec &y_pred,
                  const bool normalize,
                  const arma::vec &sample_weight) {

  arma::uvec score = (y_true == y_pred);
  arma::vec dscore = arma::conv_to<arma::vec>::from(score);

  if (normalize) {
    return (sample_weight.n_elem > 0) ? 
            arma::mean(dscore % sample_weight) : 
            arma::mean(dscore);
  } else if (sample_weight.n_elem > 0) {
    return arma::dot(dscore, sample_weight);
  } else {
    return arma::sum(dscore);
  }
}

}  // namespace metrics
}  // namespace cppml
#include <iostream>
#include <cppml/metrics/AccuracyScore.h>

int main(int argc, char **argv) {
  arma::ivec y_true;
  y_true << -1 << 1 << 1 << 1;
  arma::ivec y_pred;
  y_pred << 1 << 1 << -1 << 1;
  std::cout << "Accuracy score: ";
  std::out << cppml::metrics::accuracy_score(y_true, y_pred);
  return 0;
}

任何帮助都将不胜感激

这看起来像是程序中的某个地方有未定义的行为,这在非c++11情况下是不可见的。不幸的是,这些错误往往出现在不同的地方,而不是它们最初发生的地方。您发布的代码乍一看似乎很好。我建议在示例中运行valgrind或Address Sanitizer等工具,以尝试跟踪崩溃的原始原因。未定义的行为是未定义的。问题可能存在于两个版本中,但仅在03版本中显示为segfault行为。另外,行
y_true==y_pred
不太可能是问题的根源。更有可能是调用此函数的人。我们需要一个更进一步的对话。非常感谢@ComicSansMS@Fantactive Fox先生的建议。是的,我同意@Fantastic Mr Fox的观点,问题很可能是错误的构建设置造成的@神奇的福克斯先生,事实上,这句话导致了分割错误。