macos:如何将 CLion 用于 caffe?
macos: how to use CLion for caffe?
用gcc编译就可以了:
gcc -o test_blob test_blob.cpp -D CPU_ONLY -lcaffe -lstdc++ -lglog
但是在 CLion,得到这个错误:
Undefined symbols for architecture x86_64:
"caffe::Blob<float>::mutable_cpu_data()", referenced from:
_main in main.cpp.o
"caffe::Blob<float>::Reshape(int, int, int, int)", referenced from:
_main in main.cpp.o
"google::LogMessage::stream()", referenced from:
caffe::Blob<float>::LegacyShape(int) const in main.cpp.o
caffe::Blob<float>::offset(int, int, int, int) const in main.cpp.o
caffe::Blob<float>::CanonicalAxisIndex(int) const in main.cpp.o
"google::LogMessageFatal::LogMessageFatal(char const*, int, google::CheckOpString const&)", referenced from:
caffe::Blob<float>::LegacyShape(int) const in main.cpp.o
caffe::Blob<float>::offset(int, int, int, int) const in main.cpp.o
caffe::Blob<float>::CanonicalAxisIndex(int) const in main.cpp.o
"google::LogMessageFatal::~LogMessageFatal()", referenced from:
caffe::Blob<float>::LegacyShape(int) const in main.cpp.o
caffe::Blob<float>::offset(int, int, int, int) const in main.cpp.o
caffe::Blob<float>::CanonicalAxisIndex(int) const in main.cpp.o
"google::base::CheckOpMessageBuilder::ForVar2()", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in main.cpp.o
"google::base::CheckOpMessageBuilder::NewString[abi:cxx11]()", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in main.cpp.o
"google::base::CheckOpMessageBuilder::CheckOpMessageBuilder(char const*)", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in main.cpp.o
"google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder()", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in main.cpp.o
"caffe::Blob<float>::sumsq_data() const", referenced from:
_main in main.cpp.o
"caffe::Blob<float>::cpu_data() const", referenced from:
caffe::Blob<float>::data_at(int, int, int, int) const in main.cpp.o
"caffe::Blob<float>::asum_data() const", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[3]: *** [caffe] Error 1
make[2]: *** [CMakeFiles/caffe.dir/all] Error 2
make[1]: *** [CMakeFiles/caffe.dir/rule] Error 2
make: *** [caffe] Error 2
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(caffe) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(USE_libstdcpp:BOOL false)
set(CMAKE_C_COMPILER "/usr/local/Cellar/gcc/7.2.0/bin/")
set(SOURCE_FILES main.cpp)
add_executable(caffe ${SOURCE_FILES})
target_compile_definitions(caffe PUBLIC CPU_ONLY=on)
我应该编辑什么CMakeLists.txt?
看来你的CMake工程和gcc
编译的有很大的不同。我会尝试调和两者。
首先,gcc
的 -l
标志指的是编译后应 linked 到可执行文件的库。 CMakeLists.txt 文件还应该 link 那些库。您的可执行文件实际上应该是 test_blob
并且您的项目不能命名为 caffe
因为您正在使用 caffe
库。 CMakeLists.txt 应该是这种形式:
cmake_minimum_required(VERSION 3.5) # using modern CMake
project(blob) # names your project
find_package(glog) # finds your installation of glog
find_package(caffe) # finds your installation of caffe
set(CMAKE_CXX_STANDARD 11) # sets the "-std=c++11" flag
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_COMPILER "/usr/local/Cellar/gcc/7.2.0/bin/")
set(SOURCE_FILES test_blob.cpp)
add_executable(test_blob ${SOURCE_FILES}) # creates the executable
target_link_libraries(test_blob glog caffe) # links the test_blob target to glog and caffe
target_compile_definitions(test_blob PUBLIC CPU_ONLY=on)
这应该可以解决您的 linker 错误。
用gcc编译就可以了:
gcc -o test_blob test_blob.cpp -D CPU_ONLY -lcaffe -lstdc++ -lglog
但是在 CLion,得到这个错误:
Undefined symbols for architecture x86_64:
"caffe::Blob<float>::mutable_cpu_data()", referenced from:
_main in main.cpp.o
"caffe::Blob<float>::Reshape(int, int, int, int)", referenced from:
_main in main.cpp.o
"google::LogMessage::stream()", referenced from:
caffe::Blob<float>::LegacyShape(int) const in main.cpp.o
caffe::Blob<float>::offset(int, int, int, int) const in main.cpp.o
caffe::Blob<float>::CanonicalAxisIndex(int) const in main.cpp.o
"google::LogMessageFatal::LogMessageFatal(char const*, int, google::CheckOpString const&)", referenced from:
caffe::Blob<float>::LegacyShape(int) const in main.cpp.o
caffe::Blob<float>::offset(int, int, int, int) const in main.cpp.o
caffe::Blob<float>::CanonicalAxisIndex(int) const in main.cpp.o
"google::LogMessageFatal::~LogMessageFatal()", referenced from:
caffe::Blob<float>::LegacyShape(int) const in main.cpp.o
caffe::Blob<float>::offset(int, int, int, int) const in main.cpp.o
caffe::Blob<float>::CanonicalAxisIndex(int) const in main.cpp.o
"google::base::CheckOpMessageBuilder::ForVar2()", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in main.cpp.o
"google::base::CheckOpMessageBuilder::NewString[abi:cxx11]()", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in main.cpp.o
"google::base::CheckOpMessageBuilder::CheckOpMessageBuilder(char const*)", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in main.cpp.o
"google::base::CheckOpMessageBuilder::~CheckOpMessageBuilder()", referenced from:
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* google::MakeCheckOpString<int, int>(int const&, int const&, char const*) in main.cpp.o
"caffe::Blob<float>::sumsq_data() const", referenced from:
_main in main.cpp.o
"caffe::Blob<float>::cpu_data() const", referenced from:
caffe::Blob<float>::data_at(int, int, int, int) const in main.cpp.o
"caffe::Blob<float>::asum_data() const", referenced from:
_main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[3]: *** [caffe] Error 1
make[2]: *** [CMakeFiles/caffe.dir/all] Error 2
make[1]: *** [CMakeFiles/caffe.dir/rule] Error 2
make: *** [caffe] Error 2
这是我的 CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(caffe) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(USE_libstdcpp:BOOL false)
set(CMAKE_C_COMPILER "/usr/local/Cellar/gcc/7.2.0/bin/")
set(SOURCE_FILES main.cpp)
add_executable(caffe ${SOURCE_FILES})
target_compile_definitions(caffe PUBLIC CPU_ONLY=on)
我应该编辑什么CMakeLists.txt?
看来你的CMake工程和gcc
编译的有很大的不同。我会尝试调和两者。
首先,gcc
的 -l
标志指的是编译后应 linked 到可执行文件的库。 CMakeLists.txt 文件还应该 link 那些库。您的可执行文件实际上应该是 test_blob
并且您的项目不能命名为 caffe
因为您正在使用 caffe
库。 CMakeLists.txt 应该是这种形式:
cmake_minimum_required(VERSION 3.5) # using modern CMake
project(blob) # names your project
find_package(glog) # finds your installation of glog
find_package(caffe) # finds your installation of caffe
set(CMAKE_CXX_STANDARD 11) # sets the "-std=c++11" flag
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_C_COMPILER "/usr/local/Cellar/gcc/7.2.0/bin/")
set(SOURCE_FILES test_blob.cpp)
add_executable(test_blob ${SOURCE_FILES}) # creates the executable
target_link_libraries(test_blob glog caffe) # links the test_blob target to glog and caffe
target_compile_definitions(test_blob PUBLIC CPU_ONLY=on)
这应该可以解决您的 linker 错误。