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的观点,问题很可能是错误的构建设置造成的@神奇的福克斯先生,事实上,这句话导致了分割错误。